Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何扩展$asArray返回的列表中的返回对象?_Angularjs_Firebase_Angularfire - Fatal编程技术网

Angularjs 如何扩展$asArray返回的列表中的返回对象?

Angularjs 如何扩展$asArray返回的列表中的返回对象?,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,在angularfire中$asArray返回的列表中,我很难用新方法装饰对象(而不是装饰数组本身) angularfire文档似乎建议这样做的正确方法是重写$FirebaseArray工厂中的$$added方法,返回一个新对象,该对象封装或扩展传入该方法的快照。从: 然而,当我在我的代码中这样做时,没有任何东西被添加到数组中,尽管我可以从输出到控制台看到它被调用了 var printMessageObjConstructor = function(snap) { this.$id

在angularfire中$asArray返回的列表中,我很难用新方法装饰对象(而不是装饰数组本身)

angularfire文档似乎建议这样做的正确方法是重写$FirebaseArray工厂中的$$added方法,返回一个新对象,该对象封装或扩展传入该方法的快照。从:

然而,当我在我的代码中这样做时,没有任何东西被添加到数组中,尽管我可以从输出到控制台看到它被调用了

var printMessageObjConstructor = function(snap) {
      this.$id = snap.name();
      this.snapshot = snap;
      this.$update = function(snap) {
        this.snapshot = snap;
      };
      this.printMessage = function() {
        return this.author + "'s question is: " + this.body;
      };
    };

    var ref = new Firebase("https://danculley-test.firebaseio.com/questions");
    //What Am I Doing Wrong Here?
    var arrayFactory = $FirebaseArray.$extendFactory({
      $$added: function(snap, prevChild) {
        var x = new printMessageObjConstructor(snap);
        console.log("I am being called from FirebaseDecoratedCtlOverloadAddedinNewObj.");
        return x;
      },
      $createObject: function(snap) {
        return new printMessageObjConstructor(snap);
      },
      $$updated: function(snap) {
        var i = this.$indexFor(snap.name());
        var q = this.$list[i];
        q.$update(snap);
      }
    });
    var sync = $firebase(ref, {arrayFactory:arrayFactory});

    var list = sync.$asArray();

    list.$loaded(function(list) {
      $scope.questions = list;
    });
我已经建立了一个新的精简版,用我尝试过的几个其他用例来展示这个问题。(我添加的实际方法更复杂,与视图无关,但我想做一些简单的事情来重现问题。)

我认为问题在于我不太明白$$added到底应该返回什么,或者除了返回要存储的值$$added应该有什么额外的行为。在原型或$FirebaseArray上似乎也没有添加$$来作为超级调用以获得默认行为。有人能给我指出正确的方向吗

更新


为了其他人的利益,在查看了加藤发布的类似内容后,我通过添加以下内容来解决问题,除了下面的注释行之外,几乎所有内容都是直接从源代码中复制的

$$added: function(snap, prevChild) {

        var i = this.$indexFor(snap.name());
          if( i === -1 ) {

            var rec = snap.val();
            if( !angular.isObject(rec) ) {
              rec = { $value: rec };
            }
            rec.$id = snap.name();
            rec.$priority = snap.getPriority();
            $firebaseUtils.applyDefaults(rec, this.$$defaults);

            //This is the line that I added to what I copied from the source
            angular.extend(rec, printMessageObj);


            this._process('child_added', rec, prevChild);
          }
      }
$$added: function(snap, prevChild) {

    var i = this.$indexFor(snap.name());
      if( i === -1 ) {

        var rec = snap.val();
        if( !angular.isObject(rec) ) {
          rec = { $value: rec };
        }
        rec.$id = snap.name();
        rec.$priority = snap.getPriority();
        $firebaseUtils.applyDefaults(rec, this.$$defaults);

        //This is the line that I added to what I copied from the source
        angular.extend(rec, printMessageObj);


        this._process('child_added', rec, prevChild);
      }
  }

为了其他人的利益,在查看了加藤发布的链接后,我通过添加以下内容解决了这个问题,除了下面的注释行之外,几乎所有内容都是直接从源代码复制的

$$added: function(snap, prevChild) {

        var i = this.$indexFor(snap.name());
          if( i === -1 ) {

            var rec = snap.val();
            if( !angular.isObject(rec) ) {
              rec = { $value: rec };
            }
            rec.$id = snap.name();
            rec.$priority = snap.getPriority();
            $firebaseUtils.applyDefaults(rec, this.$$defaults);

            //This is the line that I added to what I copied from the source
            angular.extend(rec, printMessageObj);


            this._process('child_added', rec, prevChild);
          }
      }
$$added: function(snap, prevChild) {

    var i = this.$indexFor(snap.name());
      if( i === -1 ) {

        var rec = snap.val();
        if( !angular.isObject(rec) ) {
          rec = { $value: rec };
        }
        rec.$id = snap.name();
        rec.$priority = snap.getPriority();
        $firebaseUtils.applyDefaults(rec, this.$$defaults);

        //This is the line that I added to what I copied from the source
        angular.extend(rec, printMessageObj);


        this._process('child_added', rec, prevChild);
      }
  }

如果你看,你会发现它不会返回任何东西。它在内部应用更新。非常感谢您的指针@Kato。由于我更新了上面的帖子,我主要通过从源代码复制和粘贴并添加一行来解决这个问题。我有点困惑,为什么要调用
$FirebaseArray.$$added.call(this,snap,prevChild)不起作用(它表示$FirebaseArray上不存在$$added)。这似乎也与文档中所做的相矛盾;更合理的做法是(至少对我来说),在rec作为参数处理之前,该函数调用另一个函数,然后将其传递给_进程,除非该函数返回false。在$FirebaseArray中,这可能是一个无操作函数,但很容易扩展以装饰实际记录。请将您的解决方案添加为实际答案并接受它。在StackOverflow上,您可以自己回答这样的问题。谢谢您的解释,它可以帮助我。本例中的printMessageObj是什么?这里没有声明,只有printMessageObjConstructor。谢谢