Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Web uygulaması

Açıklama

Veri tazeleme ve değişiklik sinyalleri

data-bus.js içindeki veri değişti sinyalinin GenApi değişikliklerinden listelere, saklanan ekranlara ve paketlere nasıl ulaştığı.

Bir kayıt oluşturulduğunda, güncellendiğinde, devre dışı bırakıldığında, yeniden etkinleştirildiğinde veya bir aksiyonla değiştiğinde, onu gösteren her ekran kullanıcı başka yere gidip dönmeden tazelenmelidir. Web uygulaması bunu webapp/js/data-bus.js içinde tanımlanan tek bir sinyalle, cluster:data-changed ile çözer. Bu sayfa sinyali kimin yaydığını, kimin dinlediğini, arka planda tutulan ekranların nasıl yetiştiğini ve önbelleğe alınmış verinin nasıl düşürüldüğünü açıklar. Masaüstü karşılığı masaüstü bölümünde anlatılan sinyal veriyoludur.

Kısaca

  • Metadata güdümlü değişiklikler için tek yayıcı GenApi sınıfıdır: değiştiren her yöntem _changed çağırır; bu, modülün önbelleğe alınmış listelerini düşürür ve emitDataChanged çağırır (webapp/js/gen-api.js:44-51).
  • emitDataChanged bir oturum sayacını artırır ve {module, entityType, id, kind, seq} ile cluster:data-changed yayar (webapp/js/data-bus.js:11-22).
  • watchData(el, cb) yalnız öğe ekrandayken geri çağırır ve öğe yok edildiğinde aboneliği kaldırır (webapp/js/data-bus.js:33-44).
  • Arka planda canlı tutulan bir ekran döndüğünde sayacı karşılaştırır ve arada veri değiştiyse yeniden çizer (webapp/js/home.js:2283-2326).

Nasıl çalışır

Sinyal yolu

Akış şeması bir değişiklikten tazelenen ekranlara giden yolu gösterir.

flowchart LR
  call["GenApi create, update, remove, bulkDelete, reactivate, action"] --> changed["_changed"]
  changed --> inval["invalidateModule"]
  changed --> emit["emitDataChanged"]
  emit --> event["cluster:data-changed"]
  event --> list["makeGenList watchData"]
  event --> meta["meta.js katman tazeleme"]
  event --> bundle["kapılı paket watchData"]
  emit --> seq["dataSeq sayacı"]
  seq --> resume["dönüşte unstashInto"]
  seq --> homeseq["refreshHomeIfStale"]

Sözle:

  1. GenApi üzerinden bir değişiklik (create, update, remove, bulkDelete, reactivate veya GET olmayan bir action) _changed(kind, id) çağırır (webapp/js/gen-api.js:98-174).
  2. _changed, o modülün önbelleğe alınmış her seçenek listesini ve etiketini silen invalidateModule(module) çağırır (webapp/js/gen-api.js:300-311). Yorum, hangi listenin değiştiğini tahmin etmek yerine modülün tüm girdilerinin düşürüldüğünü belirtir.
  3. _changed ardından modül, varlık türü, kimlik ve türle emitDataChanged çağırır (webapp/js/gen-api.js:48-51). Tür create, update, deactivate, activate veya action değerlerinden biridir.
  4. Ekrandaki bir liste, değişiklik kendi modülündeyse ve son yüklemesi değişiklikten eskiyse yeniden yükler (webapp/js/gen-list.js:368-372, webapp/js/gen-list.js:411).
  5. Varlık türü tenant_field_definition veya tenant_field_setting olduğunda meta.js kiracı alan katmanını yeniden uygular (webapp/js/meta.js:252-256).
  6. Kapılı paketler emitDataChanged, watchData ve dataSeq işlevlerini platform bağlamı üzerinden alır; böylece kendi değişikliklerini duyurabilir ve başkalarınınkini dinleyebilirler (webapp/js/custom-widgets.js:85-90). Intranet paketi watchData ile dinler (gated_apps/intranet/app.js:1175); analitik, üretim ve proje paketleri önbelleklerini geçersiz kılmak için dataSeq kullanır (gated_apps/analytics/app.js:3944, gated_apps/production/app.js:1065, gated_apps/projects/app.js:696).

Arka plandaki ekranlar

Ekranda olmayan bir ekran hemen tazelenmez:

  • watchData öğe kopukken geri çağırmayı atlar. Öğenin kökü bir belge parçasıysa ekran canlı tutulur ve dinleyici kalır; değilse dinleyici kendini kaldırır (webapp/js/data-bus.js:33-44).
  • Bir uygulama arka plana alındığında stashActive dataSeq() değerini kaydeder (webapp/js/home.js:2287-2289).
  • Döndüğünde unstashInto, sayaç değiştiyse, uzaktayken bir boyama düştüyse veya geç bir boyama boş içerik alanına düştüyse üst görünümü yeniden çizer. Açık bir form varken yeniden çizmez; böylece yazılan girdi kaybolmaz (webapp/js/home.js:2293-2326).
  • Ana ekran her çizimde sayacı kaydeder ve kullanıcı bir değişiklikten sonra ona döndüğünde yeniden çizer (webapp/js/home.js:935-937, webapp/js/home.js:2884-2900).

Düşen boyamalar

Ekranı arka plandayken biten eşzamansız bir boyama aksi hâlde kaybolurdu. Boyayanlar el.isConnected sınamak yerine canPaint(el) çağırır; saklanan bir ekranda yapılan çağrı saklanan kökü işaretler ve ekran döndüğünde paintDroppedIn(root) bu işareti bildirir ve temizler (webapp/js/data-bus.js:46-74). Modül uygulamaları, listeler, kartlar, ağaçlar ve ayar ekranları canPaint kullanır (webapp/js/module-app.js:82, webapp/js/gen-list.js:456, webapp/js/gen-detail.js:52, webapp/js/gen-tree.js:53, webapp/js/gen-settings.js:34).

Bir değişiklikten sonra form taslakları

Kaydedilen bir form taslağını siler (webapp/js/gen-form.js:1362). Arka planda açık bırakılan bir form girdisini korur, çünkü unstashInto form içeren bir ekranı yeniden çizmez (webapp/js/home.js:2324). Bkz. genel form.

Sıfırlama

Çıkış sayacı sıfırlar (webapp/js/data-bus.js:76-79) ve seçenek listesi ile etiket önbelleklerini temizler (webapp/js/gen-api.js:360-365).

Neden böyle kurulu

  • data-bus.js başlık yorumu kuralı belirtir: hiçbir ekran başka bir ekranı doğrudan çağırmaz; değişikliği yapan tek yer sinyali yayar ve görünür yüzeyler dinler. Bunu modüller arası doğrudan çağrı yasağının web karşılığı olarak adlandırır (webapp/js/data-bus.js:1-9).
  • webapp/js/data-bus.js:46-56 içindeki yorum, ekran arka plandayken bir yükleme bittiği için bir ekranın yükleme yer tutucusunda kaldığı bir durumu kaydeder.
  • Projenin yazılı mühendislik kuralları modüller arası doğrudan iletişimi yasaklar ve hepsini sunucuda EventBus, masaüstünde sinyal veriyolu üzerinden yönlendirir. Bkz. yalnız EventBus ile modüller arası iletişim.

Kurallar ve sınırlar

  • Salt okunur GET aksiyonları sinyal yaymaz (webapp/js/gen-api.js:170).
  • Tarayıcı testleri: web-client/_e2e_data_refresh.mjs, web-client/_e2e_keepalive_paint.mjs, web-client/_e2e_form_draft.mjs.

Diğer parçalarla etkileşim

Sınırlar ve açık noktalar

  • GenApi dışında doğrudan apiFetch ile yapılan değişiklikler, çağıran yaymadıkça sinyal yaymaz. Örnekler webapp/js/record-docs.js:168-176 ve webapp/js/record-docs.js:272 içindeki belge ekleme ve silme ile webapp/js/gen-detail.js:619-775 içindeki rol ve izin listeleridir. webapp/js/ içinde emitDataChanged araması yalnız data-bus.js ve gen-api.js dosyalarını bulur.
  • Sinyal tek bir tarayıcı penceresine yereldir. Başka bir sekmede veya başka bir kullanıcının yaptığı değişiklik yalnız sonraki yüklemede görülür. Koddan belirlenemedi: veri değişiklikleri için herhangi bir sunucu itme kanalı.
  • webapp/js/changed.js bu sinyalin parçası değil, değişiklik geçmişi üzerindeki Değiştirilen Kayıtlar ekranıdır. Genel ağaç ve ayar ekranları sayfasında anlatılır.

Tanıtılan terimler

Terim Kod tanımlayıcısı Tanım Türkçe terim Kaynak
data-changed signal cluster:data-changed Bir değişikliği dinleyen her ekrana duyuran belge olayı. veri değişti sinyali webapp/js/data-bus.js:12
data sequence dataSeq Bayat ekranları algılamak için kullanılan oturumluk değişiklik sayacı. veri sürümü webapp/js/data-bus.js:16
dropped paint canPaint Ekranı arka plandayken biten ve yeniden yapılması gereken bir boyama. düşen boyama webapp/js/data-bus.js:61

İlgili sayfalar


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13