Backbone Collection继承,两个构造函数

时间:2015-07-24 21:25:35

标签: javascript backbone.js underscore.js

我正在寻找一种方法来为我的所有集合提供BaseCollection以实现共享行为。

我能够使用共享函数成功完成它,但我希望在BaseCollection中出现一些初始化逻辑,以便我的所有集合都触发事件'模型更改'。有没有办法让我的BaseCollection有一个构造函数 - 下面的代码是最好的方法吗?我假设如果我放置两个初始化函数或两个构造函数覆盖函数,那么只有一个将被调用。所以我似乎只能使用其中一个。

  var BaseCollection = Backbone.Collection.extend({

          constructor: function () {

                var self = this;
                this.on('change',function(model,property){
                    self.trigger('model-change',model,property);
                });
              Backbone.Collection.apply(this, arguments);
            },

            parse: function (resp) {
                if (resp.success) {
                    return resp.success;
                }
                else if (resp.error) {
                    return this.models;
                }
                else {
                    return resp;
                }
            },

  });

  var UsersCollection = BaseCollection.extend({

            constructor: function () {   //this will override the constructor in BaseCollection, but I want both...
               this.givenName = '@UsersCollection';
               Backbone.Collection.apply(this, arguments);
            },

            initialize: function (models, opts) {
            //do something here 
            }

        });

有更好的方法吗?我遇到的一个问题是我无法覆盖构造函数两次,我只能在父(BaseCollection)类中覆盖它。那么有一种链式构造函数的方法吗?或者我几乎只有两种选择?

1 个答案:

答案 0 :(得分:0)

您可以extend而不是apply BaseCollectionBackbone.Collection来获取您想要的结果:

var BaseCollection = Backbone.Collection.extend({
    constructor: function () {
        // your base collection constructor

        // run the Backbone.Collection constructor on this
        Backbone.Collection.apply(this, arguments);
    }
});

// extends methods on BaseCollection
var UserCollection = BaseCollection.extend({
    constructor: function () {
        // your user collection constructor

        // run the BaseCollection constructor on this
        BaseCollection.apply(this, arguments);
    }
});