【问题标题】:Sync an entire collection of models in backbone.js在backbone.js中同步整个模型集合
【发布时间】:2013-01-03 20:24:46
【问题描述】:

我正在尝试将整个模型集合同步到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 的新手,所以很可能我在某处犯了一个相当基本的错误...

【问题讨论】:

    标签: jquery backbone.js


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,不错的发现。是否以这种方式使用同步而不是发出单个 AJAX 请求(与我的解决方案相比,每个模型发出一个请求)?
    • 如果我记得,它确实提出了一个请求,但我不能 100% 确定。我开始像一个理智的人一样使用 Angular,并且从未回头。
    • 角!== '理智'。骨干=♥
    • 打架打架!书呆子战争。不管哪个“更好”,它们都对某些事情有好处,有时你没有选择使用哪个。如果您的代码库是您编写的代码库,则不要转换它。
    【解决方案2】:

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

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

    或者更好,使用Collectioneach

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

    或者更好的是,使用Collectioninvoke

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

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

    来自 Backbone 文档:

    collection.sync(method, collection, [options])

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

    【讨论】:

    • 所以,我尝试了同步,但我得到了同样的错误。 syncCollection: function() { this.sync('create', this); } - 我还在搞砸什么吗?
    • 如果你得到完全相同的“Uncaught TypeError: Object [object Object] has no method 'save'”错误,那么是的,你做错了,因为你的代码甚至不应该再有'save' 调用 ;-) 但我怀疑你得到 exact 相同的错误,所以你能澄清一下你得到了什么错误吗?
    • 另外我不禁想知道:你究竟是如何调用syncCollection ......这绝不是回调,是吗?当回调被调用时,他们经常改变回调的“this”,如果它之前没有被绑定的话。如果您认为这可能是您的问题,请尝试在您的集合的 initialize 函数中调用 _(this).bindAll('syncCollection')
    • 是的,我正在使用回调,所以我尝试了破坏脚本的初始化绑定。我更新了上面的原始问题,以便您可以看到完整的图片。
    • initialize:_(this).bindAll('syncCollection') 所以你刚才说的是“让我的初始化函数成为 bindAll 调用的结果”,这显然不是你想要的 :-) 尝试将它包装在一个函数中:@ 987654335@.
    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2012-04-07
    • 2011-10-19
    相关资源
    最近更新 更多