angularjs:当数组在初始加载时没有被更改时,已触发数组监视

时间:2015-03-14 23:34:53

标签: javascript angularjs

               <div class="category">
                  <div ng-dropdown-multiselect="" options="categories" selected-model="selectedCategories" extra-settings="categoriesSettings" translation-texts="customTexts"></div>
                </div>

  $scope.$watch('selectedCategories', function(newValue, oldValue){
    console.log(newValue);
    console.log(oldValue);
    $scope.loadPosts();
  }, true);

  $scope.$watch('selectedCities', function(newValue, oldValue) {
    console.log(newValue);
    console.log(oldValue);
    $scope.loadPosts();
  }, true);

最初加载页面时触发了这两个手表。它是否应该在页面加载时没有触发并且数组没有被更改?

2 个答案:

答案 0 :(得分:1)

来自Angular Docs(就在第一个例子之前)

  

在观察者注册范围后,监听器fn是   异步调用(通过$ evalAsync)来初始化观察者。在   在极少数情况下,这是不可取的,因为在何时调用侦听器   watchExpression的结果没有改变。检测这种情况   在监听器fn中,您可以比较newVal和oldVal。如果   这两个值是相同的(===)然后监听器被调用   初始化。

您可以检查newValue!== oldValue是否可以阻止它或创建阻止第一次检查的变量。

答案 1 :(得分:1)

这是正确的观察者的行为。在回调中添加if (angular.equals(newValue, oldValue)) { return; }将解决您的问题。