2015-02-11 45 views
5

我正在使用batarang來確定某些性能問題的來源。其中一個更大的罪魁禍首是我自己的代碼,但是這個parentValueWatch事件現在已經成爲圖表的頂端,我不知道它在哪裏或觸發它。我的大腦在谷歌地圖上被谷歌搜索...有人知道嗎?AngularJS中的parentValueWatch是什麼?

(AngularJS v1.2.24)

enter image description here

+0

這是一個函數,用於監視父範圍的變化與使用'scope:{param:「=」}''的指令的隔離範圍。這是[源代碼](https://github.com/angular/angular.js/blob/v1.2.24/src/ng/compile.js#L1487)。確保您的綁定值不綁定到長時間運行的函數 – 2015-02-11 21:08:42

回答

5

ParentValueWatch是當它的父範圍指令檢查,看看是否有值發生了變化,因此,需要將自身改變。

考慮簡單的指令,

{ 
    restrict:"AE", 
    scope:{ 
     foo:'=' 
    } 
} 

現在,讓我們在父範圍說,foo是一個對象。

$parent.$scope.foo = { 
    bar:"zim" 
} 

每個$digest循環,孩子$範圍將需要檢查父範圍的foo價值和它的各個屬性。

如果foo是一個非常大且深度嵌套的對象,這將需要很長時間,因此它需要這麼長時間。

的HTML裏面看,這可能是這樣的:

<div parent-directive> 
<div foo-directive foo=bar></div></div> 

一個快速解決有關此是「凍幹」使用NG-初始化值。

<div parent-directive> 
<div foo-directive ng-init='zug={bar:$parent.foo.bar}' foo=zug></div></div> 

現在綁定到新對象的值。你失去了簡單的約束,但獲得了性能。

它總是一個折衷。