我有一个针对 ui-select2 下拉列表模型的手表设置(来自 ui-bootstrap)。手表会在加载时触发,但不会在数据更改时触发,我不知道为什么。
这不是不 $apply 模型更改或不使用第三个参数进行相等比较的常见问题(至少从我的代码中)。
我需要做什么才能让它着火?
我有一个针对 ui-select2 下拉列表模型的手表设置(来自 ui-bootstrap)。手表会在加载时触发,但不会在数据更改时触发,我不知道为什么。
这不是不 $apply 模型更改或不使用第三个参数进行相等比较的常见问题(至少从我的代码中)。
我需要做什么才能让它着火?
尝试true
作为第三个参数传递给.$watch()
$watch(watchExpression, listener, objectEquality)
objectEquality(optional) – {boolean=} – 比较对象是否相等而不是参考。
我修了一些东西。
http://plnkr.co/edit/5Zaln7QT2gETVcGiMdoW?p=preview
JS
var myMod = angular.module("myApp",[]).controller("MainController", function($scope){
$scope.myModel = {selectedId:null};
}).controller("DetailController",function($scope){
$scope.items = [1,2,3,4];
$scope.watchHitCount = 0;
$scope.$watch('myModel.selectedId', function(newVal, oldVal){
console.log(newVal + " " + oldVal);
$scope.watchHitCount++;
},true);
});
index.html
<body ng-app="myApp">
<div ng-controller="MainController">
<ng-include src="'detail.html'" ng-controller="DetailController"></ng-include>
</div>
</body>
detail.html
<pre>watch hit: {{watchHitCount}}</pre>
<pre>selected value: {{myModel.selectedId}}</pre>
<select ng-model="myModel.selectedId" ui-select2="">
<option></option>
<option ng-repeat="item in items" value="{{item}}">{{item}}</option>
</select>
它抱怨找不到控制器,所以我按照我通常使用命名的 ng-app 和声明的模块来设置它,该模块上定义了控制器。
我还添加了一个对象来保存模型中的值。 将 $scope 对象用作模型是不好的做法,而您的作用域应该引用作为模型的对象。
有一个简单的解决方法,将 watch 与复杂对象而不是简单变量一起使用
例如(不要使用)
$scope.selectedType=1;//default
$scope.$watch(
function () {
return $scope.selectedType;
},
function (newValue, oldValue) {
if (!angular.equals(oldValue, newValue)) {
$scope.DoWork();
}
},
true);
但在下面使用
$scope.selecteditem={selectedType:1};
$scope.$watch(
function () {
return $scope.selecteditem.selectedType;
},
function (newValue, oldValue) {
if (!angular.equals(oldValue, newValue)) {
$scope.DoWork();
}
},
true);
请注意,第二个示例中的“slectedTypes”位于对象内部,而不仅仅是范围变量。这甚至适用于旧的 Angular 版本。
如果您使用的是控制器作为方法,一些阅读可能会建议使用如下语法:
var myController = {
myValue: 1
};
$scope.$watch('$ctrl.myValue', function () {
...
}, true);
相反,只需将字段包装在这样的函数中:
var myController = {
myValue: 1
};
$scope.$watch(function () {
return myController.myValue;
}, function () {
...
}, true);
唯一对我有用的东西:
var ctrl = this;
this.$onInit = function () {
console.log("id " + ctrl.event.id);
};