Backbone: 如何直接从集合中保存模型的属性更改?

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

关于我的 Backbone 架构理解,这不是很具体但很常见的问题。

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

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

因此,我在要呈现列表和show/edit集合中的特定模型的地方启动视图:

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。请说明您将如何解决这个问题!

为了避免此类问题,我总是喜欢做的一件事是创建一个 "list view" 和一个 "item view",并在列表视图上呈现多个项目视图。这允许我有两个单独的事件散列:一个在项目视图级别,一个在列表视图级别。这样做还可以明确 Backbone 事件处理应该去哪里(如果我们专注于一个模型,则为项目视图,如果我们专注于集合,则为列表视图)。

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

最后描述的问题是我定义的模型中的cos of url 不是urlRoot.