【问题标题】:AngularFire 0.5.0 $on 'change' event not firing correctlyAngularFire 0.5.0 $on 'change' 事件未正确触发
【发布时间】:2013-12-31 15:30:42
【问题描述】:

假设我有一组文章要分页。

我正在使用$on("change") 事件来监听indexlimit 的变化

.controller('articlesCtrl', ["$scope", "$firebase", "$stateParams", function($scope, $firebase, $stateParams) {

  var limit = 2;
  var index = $stateParams.id;
  var articlesRef = new Firebase("https://example.firebaseio.com/articles").startAt(null, index).limit(limit);
  var obj = $firebase(articlesRef);

  obj.$on("change", function() {
    var keys = obj.$getIndex();
    index = keys[keys.length-1];
    console.log(obj);
  });

  $scope.update = function(){
    limit = limit + 2;
    obj = $firebase(articlesRef.startAt(null, index).limit(limit));
  }

}]);

我注意到 - 在初始加载$on("change") 事件触发两次。

并且每次后续调用更新indexlimit都不会触发$on("change")事件。

<button type="button" ng-click="update();">Update</button>

【问题讨论】:

    标签: javascript angularjs firebase angularfire


    【解决方案1】:

    每次 $scope.update 触发时,您都会将 obj 变量分配给新的引用。但是,您只能将obj.$on(change) 附加到原始obj

    这可能会通过一些实验进行优化;这里有一个快速的蛮力让你开始:

    var limit = 2;
    var index = $stateParams.id;
    var articlesRef = new Firebase("https://example.firebaseio.com/articles");
    
    $scope.update = update;
    update(); // initialize
    
    function update(){
       limit = limit + 2;
       var obj = $firebase(articlesRef.startAt(null, index).limit(limit));
       obj.$on("loaded", function() {
          var keys = obj.$getIndex();
          index = keys[keys.length-1];
          console.log(obj);
       });
    }
    

    【讨论】:

    • AngularFire 没有将$on('change') 事件附加到新参考中是否有原因?如果您使用相同的变量名和范围,这对我来说似乎很愚蠢。
    • 这是一个完全不同的 javascript 引用——obj 现在指向内存中的一个新位置,一个新的变量分配——没有办法引用旧的,知道你已经擦除了内存位置,或将两者联系在一起。我提供的方法有问题吗?除了根据您提供的用例工作之外,这是一种更清晰的范围和不易出错的组织方式。
    • 哦,我不是在和你说话,而是在和 AngularFire 说话。我的意思是,如果您更新 ref 的值,我觉得应该触发 $on('change') 事件。我觉得 AngularFire 应该将更新的 ref 绑定到旧对象,如果你像这个例子一样明确地重新声明它的新值。只是大声思考。
    • 有问题的 obj 没有更改,因为您创建了一个新的 $firebase 实例并对其应用了 limit() 或 startAt()。它仍然包含相同的、未更改的数据。您的新对象已更改,但绝不会修改旧对象或与旧对象交互。由于您已经删除了对它的引用,通过将obj 替换为新指针,它们无论如何都无法交互或相互交谈,即使这是合乎逻辑的。我认为,一旦您了解了所涉及的所有组件,您就会发现这是不可取的,并且在技术上是不可能的。
    • 我明白你现在在说什么了。出于某种原因,我认为$on 的行为类似于$watch,但现在我意识到$on 不是接受参数的观察者,它实际上是对象本身的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多