簡體   English   中英

阻止或擴展Breeze元數據自動獲取

[英]Block or extend Breeze metadata auto fetching

當前應用程序-Breeze的Angular應用程序。 應用程序具有約7個實體管理器和不同的數據域(元數據)。 當應用程序運行時,我們嘗試獲取實體管理器,例如:

app.run(['$rootScope', 'datacontext1', ... ], function($rootScope, datacontext1, ...) {
   datacontext1.loadMetadata();
...
   datacontext7.loadMetadata();
}

每個數據上下文都有其自己的實體管理器,並且loadMetadata為:

function loadMetadata() {
  manager.fetchMetadata().then(function(mdata) {
       if (mdata === 'already fetched') {
          return;
       }
       ...
       applyCustomMetadata(); // Do some custom job with metadata/entity types
  });
}

元數據異步來自服務器。 很少有模塊具有真正的大元數據,例如200Kb,並且需要一些時間來加載並應用於實體管理器。 在該loadMetadata操作完成之前,可能會啟動在同一實體管理器中執行的第一個Breeze數據請求,據我所知,Breeze會自動再次獲取元數據。 通常這不是問題,Metadata端點緩存在服務器上,但有時會產生微風-EntityManager.fetchMetadata將諾言解析為“已獲取”,在這種情況下,applyCustomMetadata()操作無法執行。

據我所知,問題是在Breeze內部,並使用它來解決元數據承諾(似乎是http適配器是單例,第二個請求使用“已獲取”字符串覆蓋元數據,並且applyCustomMetadata()操作從不執行)。

需要找出一些方法來解決問題,而無需對應用程序進行重大更改。

從邏輯上講,需要在loadMetadata完成時延遲使用實體管理器的完整應用程序。 在微風級別上尋找任何方式來禁用自動獲取元數據(如果已在進行中)(但不中斷請求,請稍等片刻,然后再試一次)。 任何其他想法也可以。

為什么允許查詢在加載元數據之前執行? 這就是你的問題。

我有一個通過全局變量公開的應用程序引導程序; 在完成初步流程之前,沒有啟動任何依賴於Entity Manager的應用程序活動:

var bootstrapper = {
    pageReady: ko.observable(false)
};

initBootstrapper();
return bootstrapper;

function initBootstrapper() {
    window.MyApp.entityManagerProvider.initialize() // load metadata, lookups, etc
        .then(function () {
            window.MyApp.router.initialize(); // setup page routes, home ViewModel, etc
            bootstrapper.pageReady(true); // show homepage
        });
};

此外,根據組織中數據庫更改的頻率,您可能希望在page_load上將元數據同步傳遞到客戶端。 有關更多詳細信息,請參閱此文檔:

http://breeze.github.io/doc-js/metadata-load-from-script.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM