javascript - 扩展 $firebaseArray 以使用 $filter

标签 javascript angularjs angularfire

第二次编辑:现在的问题是无法将 $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/

相关文章:

javascript - JavaScript 中的正则表达式仅屏蔽字符串中的数字和特殊字符(/、空格、-)

javascript - 使用 promise 内的数据更新 angular2 View /全局变量

javascript - 错误 : [ng:areq] Argument 'fn' is not a function, 得到对象

jquery - Protractor - 获取菜单元素时出现问题

javascript - Uncaught Error : [$injector:modulerr] Failed to instantiate module polmgr due to

php - 将一个文本字段的数字内容从另一个文本字段中减去并实时显示结果?

javascript - 如何创建一个使用 post 方法重定向的链接

angularjs - 新 Firebase 中的 Firebase angularfire

angularjs - Firebase 处理列表数据

javascript - 如何在 Firebase 3 中创建用户而不对其进行身份验证?