主干:如何保存模型集合中模型的属性更改

Backbone: How to save an attribute change of a model right from its collection?

本文关键字:模型 集合 属性 何保存 保存 主干      更新时间:2024-02-18

这不是关于我对Backbone体系结构理解的具体但常见的问题。

所以我需要直接从列表中编辑产品属性。我为产品列表创建了产品骨干模型和产品骨干集合。

在列表中,您可以选择任何型号,系统应向下滑动此型号的"编辑界面"。

因此,我启动了要渲染列表的视图,并显示/编辑集合中的特定模型:

App.Views.ProductList = Backbone.View.extend({
el: '#content',
initialize: function() {
    this.render();
},
events: {
    'click #show': 'show', // to show model interface in the list
    'click #save': 'save'  // to save model changes in the list
},
show: function(e) {
    var id = $(e.currentTarget).data('id');
    $('#product' + id).slideToggle();
},
save: function(e) {
    var id = $(e.currentTarget).data('id');
    var form = $('#product' + id + ' form');
    var model = this.collection.at(id);
    model.set(form.serializeJSON());
    model.save({
        url: '/product'
    });
},
render: function() {
    var template = _.template($('#productList').html());
    this.$el.empty().append(
        template({
            products: this.collection.toJSON()
        })
    );
    return this;
}

});

所以,伙计们,我确信在更新模型的过程中,我使用了非常非常错误的模式。我认为收藏品能够倾听收藏品模型的变化。

我选择model.save()的方式使用集合url而不是模型url,并且我不能覆盖集合url。请解释一下你将如何解决这个问题!

为了避免此类问题,我一直喜欢做的一件事是创建一个"列表视图"和一个"项目视图",并在列表视图上呈现多个项目视图。这允许我有两个独立的事件散列:一个在项目视图级别,另一个在列表视图级别。这样做还可以清楚地表明主干事件处理的方向(如果我们关注一个模型,则为项视图,如果我们关注集合,则为列表视图)。

还要记住,主干集合将所有模型事件代理到它们自己的事件触发器,因此可以执行collection.on("change:someModelAttr")。所有这些回调也将得到受影响的模型。

最后描述的问题是因为在模型中我定义了url而不是urlRoot。