当我'm通过相同的属性进行过滤
How can I watch a property for changes within a filtered array of objects when I'm filtering by that same property?
如何做到这一点:
$scope.$watch('item.completed', function(to, from){ …
与此结合:
<li ng-repeat="item in items | filter:{completed: true}" ng-controller="ItemCtrl"> …
Live plunker示例:http://plnkr.co/edit/pdFkEmxyqrzS6mc2AYo2?p=preview
当前,当我更改item
对象的completed
属性时,$watch()
不会激发。
我怀疑这与过滤器扰乱对象属性的引用有关,但如果不是这样,我怎么能做到呢?我也试过$watch(…, …, true)
和$watchCollection()
,但都没有效果。
您可以监听作用域销毁事件并从事件对象中获取值:
.controller('ItemCtrl', ['$scope', function($scope){
$scope.$on('$destroy', function(o){log(o.targetScope.item.name + '(' + o.targetScope.item.completed + '):destroyed')});
$scope.$watch('item.completed', function(to, from){
log(from + ' --> ' + to);
});
}]);
我仍然不完全确定我是否理解最终目标。我想你是说你希望能够在筛选列表中的项目发生更改时进行日志记录。我能想出几个不完美的方法。
- 把手表忘得一干二净。只需在
ng-change
上为复选框输入调用一个函数:http://plnkr.co/edit/IeAt4a31So7zjMJzptIp?p=preview - 通过
$scope.$watch('items', listener, true)
对items数组本身创建深度监视。第三个参数true
将导致使用对象相等检查,然后您可以比较数组的前后状态,并记录每次更改的内容:http://plnkr.co/edit/gg5DPWJhx8syhNhelFOT?p=preview
两者都不是一个watch
,它在列表中为您提供了一个特定的更改项目,但我认为您可以通过这些途径获得最终需要做的事情。
如果使用ng-show而不是过滤,则应该能够启动watch函数。
<li ng-repeat="item in items" ng-show="{{item.completed}}" ng-controller="ItemCtrl">
这是一种很有技巧的方法,但我想它可以满足OP的要求:
http://plnkr.co/edit/wGRJIGJbALjMQqeffCyF?p=preview
这也证明了乔纳斯纳斯和PSL是完全正确的。
这个想法是在控制器中做到这一点:
.controller('ItemsCtrl', ['$scope', function($scope){
$scope.items = [
{name: 'item 1', completed: true},
{name: 'item 2', completed: true},
{name: 'item 3', completed: true},
{name: 'item 4', completed: false},
{name: 'item 5'},
{name: 'item 6', completed: true},
];
$scope.itemsToWatch=[];
$scope.watchMe = function(item){
var myIdx = $scope.items.indexOf(item);
if($scope.itemsToWatch.indexOf(myIdx)==-1){
$scope.itemsToWatch.push(myIdx);
$scope.$watch('items[' + myIdx + '].completed', function(to, from){
log(from + ' --> ' + to);
});
}
};
}])
.controller('ItemCtrl', ['$scope',function($scope){
$scope.$parent.watchMe($scope.item);
}]);
我不认为我会在真正的应用程序中编写这样的代码,但找到解决问题的方法很有趣,在这个过程中我学到了一些东西。
相关文章:
- 如何在Leaflet.js中按属性过滤TopoJSON功能
- Knockoutjs 模板:在通过某些属性过滤该数组后,如何将 1 个对象数组用于 2 个 DOM 元素
- 按对象属性过滤对象的角度
- Angularjs ng-repeat按一个属性过滤,属性重复问题
- ng重复 按深层属性过滤
- 培根.js如何基于另一个属性过滤事件流
- jQuery - 使用类属性过滤
- 按对象的属性过滤对象的 JavaScript 数组并删除重复项
- Knockout-通过多个对象属性过滤可观测阵列中的对象
- 在Angularjs应用程序中,使用嵌套对象属性过滤ng repeat不起作用
- 如何通过按钮数据属性过滤JSON文件
- 通过数组中对象内的对象属性过滤对象数组
- 基于JavaScript中嵌套的属性过滤出数组
- js查询模型通过集合属性过滤
- 如何在node.js中使用属性过滤Json数据?
- 根据data-*属性过滤选择选项
- 在Angularjs中通过对象属性过滤
- Ng-repeat -通过对象's常量属性过滤出不同的值
- 用外部的ng-repeat's object属性过滤嵌套的ng-repeat
- 如何在JavaScript中高效地合并两个对象数组,并按属性过滤重复项