第二次编辑:现在的问题是无法将 $scope.hashtag 传递给 hashFilter 回调函数。很近!
进展编辑:我真的很接近破解这个问题,但不知道如何在 $scope 更改时重新运行过滤器。 $watch 似乎不起作用。
这是一个带有新 $extend
$firebaseArray
示例的 plnkr: http://plnkr.co/edit/RUwL0Cstm9c8jhI2VGi9?p=preview
我只需要在 $scope.hashtag 更改时重新运行它。
//Factory
app.factory('FilteredArray', function($firebaseArray){
var FilteredArray = $firebaseArray.$extend({
$$added: function(snap) {
var rec = $firebaseArray.prototype.$$added.call(this, snap);
if( !this.filterFn || this.filterFn(rec) ) {
return rec;
}
},
filter: function(filterFn) {
this.filterFn = filterFn;
}
});
return function(listRef){
return new FilteredArray(listRef);
};
});
//Controller
var ref = new Firebase("https://plnkr.firebaseio.com/things");
$scope.things = new FilteredArray(ref);
$scope.things.filter(hashFilter);
$scope.hashtag = 'something';
function hashFilter(rec) {
console.log('hashFilter ran');
var result = false;
angular.forEach(rec, function(value, key, obj) {
if (obj.hashtag) {
if (obj.hashtag == $scope.hashtag) {
console.log(obj.hashtag == $scope.hashtag);
result = true;
}
}
});
return result;
}
原帖:
我试图从我的 Controller 中 $filter
一个 $firebaseArray
但无法让它工作。
在 View 中,一切都像这样运行良好(简化):
ng-repeat = "thing in things | filter: 'something'"
不幸的是,在 Controller 中:
$scope.things = $filter('filter')(theUnfilteredFirebaseArray, 'something');
不起作用。我认为这与 $firebaseArray
有关,但我不确定。
数据结构如下:
things: {
thingID1: {
something: 'value';
},
thingID2: {
something: 'value'
},
...
}
我偶然发现了 Kato 的这篇文章,但我不知道如何在这里实际应用过滤器:https://gist.github.com/katowulf/bee266e31aa60cb0eed6
有人可以给我指出正确的方向吗?
这是 plnkr 的链接:http://plnkr.co/edit/RUwL0Cstm9c8jhI2VGi9?p=preview
最佳答案
可能是因为数据尚未加载。试试这个:
var theUnfilteredFirebaseArray = $firebaseArray(...);
theUnfilteredFirebaseArray.$loaded(function(){
$scope.things = $filter('filter')(theUnfilteredFirebaseArray, 'something');
});
为什么要在 Controller 中进行过滤?在 dom 中执行此操作意味着您不必执行此操作。
关于javascript - 扩展 $firebaseArray 以使用 $filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30517448/