Próbuję zrozumieć, gdzie jest problem z moim użyciem funkcji $ scope. $ Watch, ale nie mogę zrozumieć, dlaczego funkcja zdefiniowana w zegarku nie jest uruchamiana. Mam ten wieloobiekt w materiale kątowym:
<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>
i w kontrolerach, które wywołuję $ watch dla tego widoku, powinno to być soppose 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);
});
Jednak dziennik nigdy nie zostanie osiągnięty, a lista $ scope.filter.idList nigdy nie zostanie wypełniona. Widziałem inne przykłady na stackoverflow, które pracują z tym rozwiązaniem, np. AngularJS: $ obejrzyj wybrane wejście. Dziękuję za wskazanie mi właściwego kierunku!
Odpowiedzi:
1 dla odpowiedzi № 1Jak się wydajesz $watch
w tablicy elementów spróbuj podać specyfikację true
dla trzeciego argumentu w wywołaniu zegarka, aby zrobił głęboki zegarek.
scope.$watch("data", function (newVal, oldVal) { /*...*/ }, true);
Lub alternatywnie, spróbuj $watchCollection
scope.$watchCollection("data", function (newVal, oldVal) { /*...*/ });
FYI Zostało to omówione tutaj: Jak głębiej oglądać tablicę w angularjs?
0 dla odpowiedzi nr 2
Próba, Próbka2 Odnoś oba linki. Ja też mam ten sam problem. spróbuj tego działa dobrze dla mnie .. Powinieneś użyć kropki w ng-modelu. tj. ng-model = "user.FirstName"
$scope.user = {};
$scope.$watch("user.FirstName", function() {
console.log("FirstName")
});