改变angular md中select的状态时,$ watch不会被触发

时间:2016-02-23 23:44:31

标签: javascript angularjs angular-material

我试图了解问题在于我使用$ scope。$ watch,但我无法弄清楚为什么手表中定义的函数没有被触发。我在Angular材料中有多重选择:

<md-select multiple ng-model="selectedItems" placeholder="Please select">
   <md-option ng-repeat="item in specialities" ng-value="item" ng-class="{'selected': item.selected}">
   <ng-md-icon class="checkboxfull" icon="check_box" size="18"></ng-md-icon>
   <ng-md-icon class="checkboxoutline" icon="check_box_outline_blank" size="18"></ng-md-icon>
   {{item.name}}
   </md-option>
</md-select>

并且在控制器中我正在为这个视图调用$ watch,这应该是我改编的selectedItems:

    $scope.$watch('selectedItems', function(){
        console.log("$scope.selectedItems: ",$scope.selectedItems);
        $scope.filter.idList.length = 0;
        angular.forEach($scope.selectedItems, function (item) {
          $scope.filter.idList.push(item.id);
        });
        console.log("$scope.filter.idList: ",$scope.filter.idList);
   });

但是永远不会到达日志,并且永远不会填充$ scope.filter.idList。我在stackoverflow上看到了使用此解决方案的其他示例,例如AngularJS: $watch for a select input。 感谢您指点我正确的方向!

2 个答案:

答案 0 :(得分:1)

由于您似乎$watch了一系列项目,请尝试为您的观看通话中的第三个参数指定true,以便深入观察。

scope.$watch('data', function (newVal, oldVal) { /*...*/ }, true);

或者,请尝试$watchCollection

scope.$watchCollection('data', function (newVal, oldVal) { /*...*/ });

仅供参考这里已经讨论过:How to deep watch an array in angularjs?

答案 1 :(得分:0)

Sample, Sample2参考两个链接。我也面临同样的问题。试试这个对我来说工作正常。你应该在ng-model中使用dot。即ng-model =&#34; user.FirstName&#34;

$scope.user = {};

    $scope.$watch('user.FirstName', function() {
        console.log("FirstName")
    });