如何在Firebase / angularFire中按优先级重新排序子项

时间:2013-08-28 02:27:31

标签: javascript angularjs firebase angularfire

我正在尝试按照数字优先级重新排序(交换)子项。 这是我的尝试:

var swapChildrenByPriority = function(url, child1Priority, child2Priority){
  var ref = new Firebase(url);
  var child1, child2;
  ref.on('value', function(snap){
    snap.forEach(function(child){
      if(child.getPriority() === child1Priority){
        child1 = child;
      };
      if(child.getPriority() === child2Priority){
        child2 = child;
      };
    });
  });
  ref.child(child1.name()).setPriority(child2.getPriority());
  ref.child(child2.name()).setPriority(child1.getPriority());
};

你可以想象,这不起作用。 调用此函数时,Chrome的控制台会向我抛出错误:

TypeError: Cannot call method 'name' of undefined
Uncaught TypeError: Cannot call method 'name' of undefined

看起来孩子们没有优先权设定。如果我在Forge中导入我的数据,则所有孩子都拥有“.priority”属性:5.0 当我再次调用该函数时,为了确保,我得到了这个:

TypeError: Object https://test.firebaseio.com/testPriority has no method 'child'

在firebase中执行此操作的正确方法是什么?
另外,如何在AngularFire中做同样的事情,以便使用angularFire服务的指令范围内的数据相应地重新排序,并且视图会被刷新?

我非常感谢你的时间,
至于
贾里德

1 个答案:

答案 0 :(得分:4)

将函数放在DB的回调中:

fb.on('value', function(snap){
    snap.forEach(function(child){
        if(child.getPriority() === child1Priority) {
            child1 = child;
        }
        if(child.getPriority() === child2Priority){
            child2 = child;
        };
    });
    ref.child(child1.name()).setPriority(child2.getPriority());
    ref.child(child2.name()).setPriority(child1.getPriority());
});