扩展$ firebaseArray以使用$ filter

时间:2015-05-28 21:31:49

标签: javascript angularjs angularfire

第二次编辑:现在的问题是无法将$ scope.hashtag传递给hashFilter回调函数。很近!

进展编辑:我真的很接近破解这个但是无法弄清楚当范围变化时如何重新重新运行过滤器。 $ 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;
  }

原始邮寄: 我试图从我的控制器$filter $firebaseArray但是无法使其正常工作。

在视图中,一切都很像(简化):

ng-repeat = "thing in things | filter: 'something'"

不幸的是,在控制器中:

$scope.things = $filter('filter')(theUnfilteredFirebaseArray, 'something');

不起作用。我认为这与$firebaseArray有关,但我不确定。

数据结构如下所示:

things: {
    thingID1: {
      something: 'value';
    },
    thingID2: {
     something: 'value'
    },
   ...
}

我偶然发现了加藤的这篇文章,但我无法弄清楚如何在这里实际应用过滤器:https://gist.github.com/katowulf/bee266e31aa60cb0eed6

有人可以指出我正确的方向吗?

这是指向plnkr的链接:http://plnkr.co/edit/RUwL0Cstm9c8jhI2VGi9?p=preview

1 个答案:

答案 0 :(得分:1)

可能是因为尚未加载数据。试试这个:

var theUnfilteredFirebaseArray = $firebaseArray(...);

theUnfilteredFirebaseArray.$loaded(function(){
    $scope.things = $filter('filter')(theUnfilteredFirebaseArray, 'something');
});

为什么要在控制器中过滤?在dom中执行此操作意味着您不必执行此操作。