AngularJS带有范围变量和数组的watchCollection

时间:2015-02-23 23:03:49

标签: angularjs

在我的控制器中,我有一些范围变量,如

$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”键改变时触发监视,而不是对其他键的任何更改。

非常感谢任何帮助。

3 个答案:

答案 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){
});