2015-10-06 206 views
0

Here is my PlunkAngularJS範圍模式和範圍方法

我需要了解AngularJS如何處理範圍變量,定範圍的方法的一部分。

下面是我的控制器代碼

var app = angular.module('plunker', []); 

app.controller('MainCtrl', ["$scope", function($scope) { 
    $scope.name = ""; 

    $scope.getNameLength = function(){ 
    return $scope.name.length; 
    } 
}]); 

這裏是我的html正文(只是保持我的簡單的div)

<body ng-controller="MainCtrl"> 
    <div> 
     Enter Your Name :<input type="text" ng-model="name"> 
     <br> 
     {{ "Your entered name whoes length is = " + getNameLength() }} 
    </div> 
    </body> 

由於,當我在文本框中輸入內容時,getNameLength()是調用DOM並更新以反映name的長度。

只要指令中引用的方法在名稱發生更改時調用該方法。

這裏是我的疑問: 爲什麼角呼籲所有範圍每當有視圖模型的變化的方法(在指令中被引用)?是否可以禁用此行爲?這有什麼性能影響?

+0

使用一次綁定'{{::' – YOU

+0

不完全清楚你在問什麼 – charlietfl

+0

你需要了解Angular的摘要循環如何。有大量的信息。 – dfsq

回答

0

如果擔心Angular調用方法的次數過多,並且想要限制執行,則始終可以使用ngModelOptions指令並傳遞去抖動。你可以看到文檔on the AngularJS page。例如:

<input type="text" ng-model="name" ng-model-options="{debounce: 500}"> 

只有當模型停止更新500毫秒後,纔會更新模型。你也可以使用類似ng-model-options="{updateOn: 'blur'}"的東西來更新模型後,該領域失去了重點。

就性能而言,如果它像計算字符串的長度那樣簡單,那麼您不應該擔心太多。如果它比較複雜,可能會遇到問題。

0

每當視圖模型發生變化時,爲什麼會角度調用範圍內的所有方法(指令中引用的是 )?

我沒有在您的示例中看到自定義指令,但Angular指令將從其父項繼承範圍屬性,使用父範圍或具有隔離範圍。

如果您沒有隔離範圍,除非您覆蓋它,否則它將在父級範圍內查找該屬性。因爲你有一個Angular表達式({{和}}包圍它),Angular爲表達式中的任何內容創建了一個觀察者。當它檢測到監視的變量或對象已更改時,它將更新與之相關的所有內容。

是否可以禁用此行爲?

是的,的確,正如您在您的問題的評論中提到的那樣,您可以使用'一次性綁定'。

例子:

{{normalBinding}} 
{{::oneTimeBinding}} 

是否有此任何性能意味着什麼呢?

是的,您擁有的綁定越多,觀察者越多,摘要循環所需時間越長,您的應用程序所需的時間越長,以反映更改。這是大型應用程序所關注的問題。

有關範圍和觀察者的更多信息可以在here找到。