1

我正在使用AngularJS,並且遇到問題。我有$監視控制器:知道何時在控制器中呈現DOM

function MyController() { 
    $watch('myModel', function() { 
     $rootScope.$emit('do-oper'); 
    }); 
} 

'myModel'也通過綁定更改我的DOM。

在指示我:

$rootScope.$on('do-oper', function() { 
    // Do DOM manipulation 
}); 

的問題是,在發射的時間「做-OPER」,DOM是不與更新「基於myModel」渲染。如何在DOM呈現後觸發DOM操作?

+0

是這樣的情況。你有一個指令,需要一個模型(myModel是這種情況)並呈現一個dom元素。你想觀察模型中的任何改變,以通過你的指令重新呈現內容嗎? – Anand

+2

我不認爲直接操縱DOM是使用像角度的MVC結構的好主意。你違背了這個模式。在MVC中,視圖應儘可能被動,監聽模型更改以相應更新,不應直接通過代碼更新視圖。控制器內部的代碼也不應該關心渲染視圖的時間。 –

回答

0

您可以嘗試在AngularJS中發佈app.run內的事件。

0

我不認爲操縱DOM直接操作MVC結構像角度是一個好主意。你違背了這個模式。在MVC中,視圖應儘可能被動,監聽模型更改以相應更新,不應直接通過代碼更新視圖。控制器內部的代碼也不應該關心渲染視圖的時間。

有一個解決方法,使用$timeout,但我建議你不要這樣做。重新設計你的代碼來擁抱MVC模式是一個更好的解決方案。

一種解決方法可以是這樣的:

$rootScope.$on('do-oper', function() { 
    $timeout(function(){ 
     // Do DOM manipulation 
    }); 
}); 

另一個大問題與此解決辦法是,代碼可能無意中更新DOM屬性和這些更新可以與角碰撞可能導致不可預料的結果。

您可以在指令改變這樣的事情:

$rootScope.$on('do-oper', function() { 
     //Update properties of directive's scope based on the changed `do-oper` 
}); 

你的指令模板結合範圍的屬性進行相應的更新。

0

在你需要通過角的控制範圍之外的行動在DOM變化作出反應的情況下,你可能要檢查的ng-ScrollSpy directive's code for a potential method: An AngularJS module for navigation highlighting.

特別值得注意的是,在鏈接功能,我們看到:

angular.element(document).ready(function() { 
          setup(); 
          determiner(); 
        }); 

這表明,你可以改變你的控制器代碼,或許是這樣的:

angular.element(document).ready(function() { 
        $watch('myModel', function() { 
         $rootScope.$emit('do-oper'); 
        });  
); 

進一步閱讀可能會感興趣:http://henriquat.re/directives/advanced-directives-combining-angular-with-existing-components-and-jquery/angularAndJquery.html

相關問題