Аз се опитвам да разбера къде е проблемът в използването на $ scope. Имам този мултиселектор в Ъгловия материал:
<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 за този изглед, който трябва да възпроизвеждам избрани елементи:
$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: $ следете за избор на вход, Благодаря ви, че ме посочихте в правилната посока!
Отговори:
1 за отговор № 1Както изглежда $watch
в масив от елементи, опитайте да зададете true
за третия аргумент в часовника ти, за да направи дълбок часовник.
scope.$watch("data", function (newVal, oldVal) { /*...*/ }, true);
Или пък опитайте $watchCollection
scope.$watchCollection("data", function (newVal, oldVal) { /*...*/ });
FYI Това е обсъдено тук: Как да гледате дълбоко масив в angularjs?
0 за отговор № 2
Проба, Sample2 Отговорете и двете връзки. Аз също се сблъсквам със същия проблем. Опитайте това работи добре за мен .. Трябва да използвате точка в ng-модел. т.е. ng-model = "user.FirstName"
$scope.user = {};
$scope.$watch("user.FirstName", function() {
console.log("FirstName")
});