2014-05-21 40 views
0

在我的應用程序中我$watch如果表格在做某些事情之前是有效的。問題是ngForm在我使用之前不會編譯modelsngForm在型號更新之前無效

例:http://plnkr.co/edit/Y7dL67Fn7SaSEkjiFf2q?p=preview

JS

$scope.results = []; 
    $scope.$watch(function() { 
    return $scope.testForm.$valid; 
    }, 
    function(valid) { 
     $scope.results.push(valid); 
    } 
) 

HTML

<ng-form name="testForm" ng-init="test = 1"> 
    <input ng-model="test" required> 
</ng-form> 

<p ng-repeat="result in results track by $index" ng-class="{'false': !result, 'true': result}">{{ result }}</p> 

結果:

false // Wrong 
true 

形式不應該首先是因爲$scope.test無效設置爲1

任何線索?

回答

2

根據the docs

後觀察者與範圍註冊,聽者fn異步調用(經由$evalAsync)來初始化所述觀察者。在極少數情況下,這是不可取的,因爲當watchExpression的結果沒有改變時調用監聽器。爲了在收聽者fn中檢測到這種情況,您可以比較newValoldVal。如果這兩個值相同(===),則由於初始化而調用偵聽器。


它(幾乎總是)是有道理的使用支票忽略這個第一個電話:

$scope.$watch('testForm.$valid', function (newValue, oldValue) { 
    if (newValue === oldValue) { return; } 
    $scope.results.push(newValue); 
}); 

還參見本short demo

+0

這很有道理,謝謝。 – L105

0

不知道是否理解正確,但它可能是第一次AngularJS檢查,

$scope.results = []; 

是空的,你把它推任何東西之前,因此評估結果爲假。

如果你開始一個非空的結果,說:

$scope.results = [1]; 

首先評價是truey。

我不認爲$ watch是正確的方法。我認爲你的問題與$ watch的工作方式以及Angular的消化週期有關。

+0

表格不應該無效,因爲'$ scope.test'設置爲1. – L105

+0

好的,對於我關於$ watch的評論感到抱歉,但是像ExpertSystem說的那樣,第一個$ digest pass的falsey是「正常的」來自Angular的行爲。 –

相關問題