在我的控制器中,我有一些范围变量,如
$scope.searchText = "abc";
$scope.currentPage ="1";
$scope.sortBy ="dateTime";
$scope.sortOrder="reverse";
$scope.columnSettings = [
{"name": "dateTime,
"displayName": "Datetime",
"filterText": ""
},
{"name": "name,
"displayName": "Name",
"filterText": "xyz"
},
{"name": "id,
"displayName": "ID",
"filterText": ""
}]
我需要查看“columnSettings”数组中对象的所有$ scope变量和“filterText”键。
我正在使用
$scope.$watchCollection('[searchText, sortBy, sortOrder, currentPage, itemsPerPage, columnSettings]', function(newVal, oldVal){
// Ignore initial scope change
if(oldVal && newVal !== oldVal){
// watch is triggered for changes in searchText, sortBy etc...
// but not for "filterText" change in columnSettings
}
});
我的问题是
a)针对searchText,sortBy,currentPage等中的更改触发监视...但不会对columnSettings中的“filterText”更改。我该如何解决这个问题?
b)另外,我想仅在“filterText”键改变时触发监视,而不是对其他键的任何更改。
非常感谢任何帮助。
答案 0 :(得分:2)
我猜猜filterText
是由您网页上的输入填充的。
在这种情况下,您应该在模板中使用ng-change
属性(在每个输入上),这可以触发$scope
上的事件处理程序。
正如达宾在评论中指出的那样,你要做的事情通常是一个坏主意(除非在极少数情况下我无法想象)。
答案 1 :(得分:0)
如果您只想获得有关某个对象属性的更改通知,则只需添加$watch
,如下所示:
$scope.$watchCollection('columnSettings', function (obj) {
// handle obj.filterText change
});
您无法将columnSettings
添加到$watchCollection
,因为它本身就是一个集合,所以不幸的是,它必须在它上面观看。
答案 2 :(得分:0)
我最终这样做了。
$scope.$watchCollection('[searchText, sortBy, sortOrder, currentPage, itemsPerPage]', function(newVal, oldVal){
});
并使用$ watch进行columnSettings并仅观看“filterText”更改
$scope.$watch(function($scope) {
return $scope.columnSettings.
map(function(obj) {
return obj.filterText
});
}, function(newVal, oldVal){
});