angularjs可以将模型映射到带有过滤器的“虚拟模型”吗?

时间:2013-09-13 03:57:21

标签: javascript angularjs

我将两个模型放入Angular js

// full device list
$scope.devices = [{id:1, on:true}, {id:2, on:false}, {id:3, on:true}];
// devices with on == true
$scope.devicesOn = $scope.devices.filter(function(t){return t.on==true});
页面中的

<span>the following {{ devicesOn.length }} of {{ devices.length }} are on</span>
<ul>
  <li ng-repeat='device in devicesOn'>{{device.id}}</li>
</ul>

所以模型devices是动态的。但是devicesOn不是动态的,因为它不是懒惰的评估。

我知道你可以写一些像$scope.countOnDevices = function(){return ...}这样的东西但它并不理想。有更优雅的方法来解决这个问题吗?

就像在RDBMS中从现有view创建where(应用table过滤器)。

2 个答案:

答案 0 :(得分:1)

您可以使用观察者观察设备列表的更改,当列表有任何更改时可以触发逻辑

$scope.$watch('devices', function () {
    $scope.devicesOn = $scope.devices.filter(function (t) {
        return t.on == true
    });
}, true)

Demo

答案 1 :(得分:0)

@ sza的答案很有效,我也从这里找到了另一个解决方案:

https://groups.google.com/forum/#!topic/angular/3LyIjNroT5c

https://groups.google.com/forum/#!msg/angular/7WY_BmFzd3U/Zd_jHnMu58YJ

ng-repeat='item in filtered = (items | filter:filterExpr)

然后只需使用{{filtered.length}}

demo here