2014-07-02 83 views
3

我需要知道爲什麼AngularJS爲創建的每個模型(ng模型)自動創建監視時使用$ watch函數。 (當我說模型時,我指的是像`$ scope.value =「somethign」edit->聲明的控制器中的一個值,它是通過{{}}或ng-model附加到視圖的)

我的猜測是:

1)當在模型中檢測到的變化來創建複雜的動作是非常有用的。不只是改變視圖中的值。

2)它用於將觀察者添加到未綁定視圖的值作爲模型。 (這可以解決,但這是一個很好的做法嗎?)

這只是我的猜測,我想知道我是否正確。

此外,如果有任何先進的方式來使用$手錶,請告訴請。

謝謝。

回答

4

正如你所說,角創建$手錶屏幕上的每一個結合。這包括ng-model{{ ... }}(和ng-repeat和其他指令)。

什麼時候你想創建自己的$ watch功能?

你的第一個猜測是很好的。如果您需要在模型更改時運行一些代碼,則需要在上面放置一個監視器。

想象一下,你有一個指令,顯示一些圖表,該指令通過屬性接收一些數據。這個想法是在新數據到達時做一些計算。你是怎樣做的?你需要觀看這些數據。當數據發生變化時,$ watch會觸發並執行計算,然後更新DOM。

看到一個例子here

你的第二點可能是有用的。一個$表可以返回的代碼像任何一種..

$scope.$watch(function() { return service.foo; }, function() { ... }); 

所以如果foo對服務的變化,$手錶將被觸發。在某些用例上可以得心應手。

+0

我有另一個問題耶穌。當觀察者被自動添加到摘要時會發生什麼情況,但用戶會將另一個觀察者添加到同一個變量中。這對於摘要循環性能不是有害的嗎? –

+0

任何$ watch都會爲頁面增加一次性能。 100手錶不會傷害,也許1000也不會傷害,你只需要讓你的手錶快速,AKA不會給他們帶來沉重的任務。您可以根據需要添加儘可能多的監視器,所有這些監視器都可以運行。在你的情況下,你可以有一個ng模型的$ watch,但也可以在模型更改時觸發另一個監視器。 –

1

AngularJS不會自動創建監視功能,除非您(隱式地)告訴它執行此操作。這些隱式方法是通過將它添加到表達式語言的模板中或通過在指令中使用它。

此外,$ scope。$ watch函數在值更改時運行一段代碼非常有用。我不明白爲什麼你應該添加一個觀察者到一個沒有綁定到視圖的值。這通常會隨着一個函數或者被另一個正在監視的值觸發而改變。這將是使用$ scope的好例子。

瞭解更多關於AngularJS的消化週期和$手錶和$在這個所謂的問題,應用功能: How do I use $scope.$watch and $scope.$apply in AngularJS?

+0

對不起,當我說手錶會自動添加到摘要循環中時,我並不是指它基於我給出的模型的定義,而是我的意思是ng模型。 「value」被添加到diggest循環中,不是嗎? –

+0

那麼,它不必看着輸入字段,直到你做了什麼。所以那就是當你在另一個函數中使用模型,或者一個鏈接到該字段的動作被觸發時。檢查從Angular文檔中採用的以下plunkr:http://plnkr.co/edit/JKj1MoXKMdumesiT2DhP?p=preview。如果您沒有觀察ng模型更改的事件,則它們並置的值不會改變。 – jvdp

+0

我不完全同意耶穌的回答,它並不隱含地觀察ng模型,正如你在plunkr中發現的那樣。除此之外,比我的更好,更完整的答案。 – jvdp