7

我正在尝试将整个模型集合同步到backbone.js 中的服务器。我想将一个 JSON 包发布到包含所有集合模型属性的服务器。这应该很简单,但我不确定我做错了什么:

      var RegisterCollection = Backbone.Collection.extend({ 
    initialize: function () {_(this).bindAll('syncCollection');},

    model: RegisterModel, 

    url: 'api/process.php',
    updateModel: function(registerModel) {
        var inputName = '#'+registerModel.get('inputName');
        var userInput = $(inputName).val();
        registerModel.set({value: userInput});
    },
    syncCollection: function(registerModel) {
        this.sync();
    }

});
var RegisterCollectionView = Backbone.View.extend({
    el: "#register",
    events: {
        "click #submit" : "validate"
    },

    validate: function(e) {
        e.preventDefault();
        $("#register").valid();
        if ($("#register").valid() === true) {
            this.updateModels();
            this.collection.syncCollection();
        }
    },
    updateModels: function (){
        this.collection.forEach(this.collection.updateModel, this);;    
    },
    initialize: function(){
        this.collection.on('reset', this.addAll, this);
    },  
    addOne: function(registerModel){
        var registerView = new RegisterView({model: registerModel});
        this.$el.append(registerView.render().el);  
    },
    addAll: function(){
        this.$el.empty();
        this.collection.forEach(this.addOne, this);
        this.$el.append('<button type="submit" class="btn-primary btn" id="submit" style="display: block;">Submit</button>');
    },
    render: function(){
        this.addAll();
        return this;
    }
});
var registerCollection = new RegisterCollection();
registerCollection.fetch();

var registerCollectionView = new RegisterCollectionView({collection: registerCollection});
registerCollectionView.render();

当我尝试调用 syncCollection() 时,它返回以下错误:Uncaught TypeError: Object [object Object] has no method 'save'我是 Backbone 的新手,所以很可能我在某处犯了一个相当基本的错误......

4

2 回答 2

13

好的,一壶新鲜的咖啡,一天后,我拿到了。我们不正确地调用了sync()。这是我们应该做的:

syncCollection: function() {
        Backbone.sync('create', this);
    }

感谢 machineghost 帮助我探索这个问题 - 我完全专注于错误的事情。

于 2013-01-04T16:34:09.807 回答
4

您收到该错误的原因是Backbone.Collection没有保存方法(它的模型有)。我认为您正在寻找的是:

syncCollection: function() {
    _(this.models).each(function(model) {
        model.save();
    });
}

或者更好的是,使用Collection's each

syncCollection: function() {
    this.each(function(model) {
        model.save();
    });
}

或者更好的是,使用Collection's invoke

syncCollection: function() {
    this.invoke('save');
}

但是,我不确定您是否需要任何这些,因为Backbone.Collection已经有一种方法可以(我认为)您想要的:sync.

从骨干文档:

collection.sync(方法,集合,[选项])

使用 Backbone.sync 将集合的状态持久化到服务器。可以覆盖自定义行为。

于 2013-01-03T20:35:23.823 回答