7

我有一個帶ASP.NET應用程序的iframe,它包含UpdatePanel。我在應用程序內部開始使用Angular,但由於.NET回發,事情並不奏效。檢查AngularJS模塊是否被引導

爲了解決這個問題,我用這個解決方案:

with (Sys.WebForms.PageRequestManager.getInstance()) { 
      add_endRequest(onEndRequest); // regester to the end Request 
     } 

function onEndRequest(sender, args) { 
    angular.bootstrap($('#mainDiv'), ['defaultApp']); 
    var rootscope = angular.element('#mainDiv').scope(); 
    if (rootscope) { 
     rootscope.$apply(); 
    } 
} 

而且它的偉大工程。

的問題是,當我動態加載在ASP.NET頁面不同的用戶控制,與其他NG-控制器,角拋出一個錯誤,說應用程序已經加載:

App Already Bootstrapped with this Element 

所以問題是:我如何檢查應用程序是否已被引導?我可以重新加載這個模塊嗎?我可以從元素中移除它並重新引導它嗎?

謝謝。

回答

2

您可以簡單地檢查mainDiv的範圍,如果angular.element(document.querySelector('#mainDiv')).scope()不是undefined那麼意味着angular尚未初始化。

您的代碼如下所示。

CODE

function onEndRequest(sender, args) { 
    //below flag will be undefined if app has not bootsrap by angular. 
    var doesAppInitialized = angular.element(document.querySelector('#mainDiv')).scope(); 
    if (angular.isUndefined(doesAppInitialized)) //if it is not 
     angular.bootstrap($('#mainDiv'), ['defaultApp']); 
    var rootscope = angular.element('#mainDiv').scope(); 
    if (rootscope) { 
     rootscope.$apply(); //I don't know why you are applying a scope.this may cause an issue 
    } 
} 

更新

在以後的2015年8月,有它通過禁用調試信息禁用調試信息添加性能相關的改進角1.3+版本之後。所以通常我們應該啓用debuginfo選項爲false,以便在生產環境中有良好的性能改進。我不想寫太多,因爲它已經覆蓋了@AdamMcCormick的答案,這非常酷。

+0

@Guy你有沒有檢查,它工作與否? – 2015-02-12 13:42:23

+0

不會'angular.bootstrap(...)'導致Angular在每次調用這個函數時嘗試引導應用程序? – 2015-05-26 15:22:50

+0

同意,DIMM。 'angular.element(...)。scope()'會更好。 – oakfish56 2015-08-26 14:16:42

14

從應用程序外部訪問作用域並不是一種好的做法,因此它在構建良好的生產應用程序中未啓用。如果你需要訪問/應用範圍,那麼你的用例有一些奇怪/不支持的地方。

但是,檢查元素是否已被引導的正確方法是Angular庫執行此操作的方式,即加載元素並檢查噴射器。所以,你會希望angular.element(document.querySelector('#mainDiv')).injector();這使得代碼:

function onEndRequest(sender, args) { 
    var element = angular.element(document.querySelector('#mainDiv')); 

    //This will be truthy if initialized and falsey otherwise. 
    var isInitialized = element.injector(); 
    if (!isInitialized) { 
     angular.bootstrap(element, ['defaultApp']); 
    } 

    // Can't get at scope, and you shouldn't be doing so anyway 
} 

你能告訴我們你爲什麼需要應用範圍有多大?

+1

這應該被標記爲正確的答案 – trickpatty 2016-03-22 17:19:27

+0

你能給我一些關於你正在使用注射器?你在一個dom元素上調用它,我可以在哪裏找到關於這個用法的一些引用?謝謝 – user449689 2016-06-08 09:01:51

+0

@ user449689:除了角內部之外沒有任何東西。我必須閱讀他們的代碼才能發現它。 AFAIK,這是它發佈的唯一正確途徑。 – 2016-06-08 15:45:14