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.
关于我的 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.