如何防止 Backbones save 方法尝试更新每个模型?
How can I prevent Backbones save method from trying to update every model?
我正在使用 backbone 创建一个 crud web 应用程序。我正在编写更新资源 (PUT) 的功能。我试图通过从服务器获取模型属性(参见 SubscriberView)并成功获取资源以实例化 SubscriberEditView 来实现这一点,从而传递新获取的模型。
到目前为止,这按预期工作; SubscriberEditView 呈现一个 html 表单,其中填充了模型实例属性。
当我在表单中输入新的登录值时,我可以触发更新功能,该功能成功地向服务器资源发出 PUT 请求并按预期更新模型实例。
但是,问题是当我用另一个模型实例重复这个过程时,PUT 请求是针对当前模型和先前实例化的模型发出的。
这是因为我现在有两个 SubscriberEditView 实例吗?还是我有其他东西 missed/misunderstood.
请参阅下面描述的代码。
// The view for a single subscriber
var SubscriberView = Backbone.View.extend({
tagName: 'tr',
template: _.template($('#subscribers-tmpl').html()),
initialize: function() {
this.listenTo(this.model, 'destroy', this.remove);
},
render: function() {
var html = this.template(this.model.toJSON());
this.$el.html(html);
return this;
},
events: {
'click .remove': 'onRemove',
'click .edit-subscriber': 'editSubscriber',
},
editSubscriber: function() {
var getSubscriberModel = this.model.set('id', this.model.attributes.id, {silent:true})
getSubscriberModel.fetch({
success: function (model, response) {
$('#addSubscriber').fadeOut();
new SubscriberEditView({model:model});
},
error: function (response) {
console.log('There was an error');
}
});
},
onRemove: function() {
this.model.destroy();
}
});
// The edit view
var SubscriberEditView = Backbone.View.extend({
tagName: 'div',
el: '#updateSubscriber',
template: _.template($('#subscriberEdit-tmpl').html()),
initialize: function() {
this.model.on('sync', this.render, this);
},
events: {
'click #close': 'cancel',
'click .save-subscriber': 'update'
},
update: function() {
var $login = this.$('#login');
this.model.save({
login: $login.val(),
},
{
dataType: 'text',
success: function (model, response, options) {
console.log('success');
},
error: function (model, response, options) {
console.log('error');
}
});
},
cancel: function() {
$('#addSubscriber').fadeIn();
$('#editInner').fadeOut();
},
render: function() {
var html = this.template(this.model.toJSON());
this.$el.html(html);
},
});
如果有人能提供帮助,我们将不胜感激。
干杯
问题是el: '#updateSubscriber',
。您所有的视图实例都指向委托事件的同一元素。所以点击任何 .save-subscriber
将触发所有视图实例的更新。您不应为将具有多个实例的视图指定 el
。
我正在使用 backbone 创建一个 crud web 应用程序。我正在编写更新资源 (PUT) 的功能。我试图通过从服务器获取模型属性(参见 SubscriberView)并成功获取资源以实例化 SubscriberEditView 来实现这一点,从而传递新获取的模型。 到目前为止,这按预期工作; SubscriberEditView 呈现一个 html 表单,其中填充了模型实例属性。 当我在表单中输入新的登录值时,我可以触发更新功能,该功能成功地向服务器资源发出 PUT 请求并按预期更新模型实例。 但是,问题是当我用另一个模型实例重复这个过程时,PUT 请求是针对当前模型和先前实例化的模型发出的。 这是因为我现在有两个 SubscriberEditView 实例吗?还是我有其他东西 missed/misunderstood.
请参阅下面描述的代码。
// The view for a single subscriber
var SubscriberView = Backbone.View.extend({
tagName: 'tr',
template: _.template($('#subscribers-tmpl').html()),
initialize: function() {
this.listenTo(this.model, 'destroy', this.remove);
},
render: function() {
var html = this.template(this.model.toJSON());
this.$el.html(html);
return this;
},
events: {
'click .remove': 'onRemove',
'click .edit-subscriber': 'editSubscriber',
},
editSubscriber: function() {
var getSubscriberModel = this.model.set('id', this.model.attributes.id, {silent:true})
getSubscriberModel.fetch({
success: function (model, response) {
$('#addSubscriber').fadeOut();
new SubscriberEditView({model:model});
},
error: function (response) {
console.log('There was an error');
}
});
},
onRemove: function() {
this.model.destroy();
}
});
// The edit view
var SubscriberEditView = Backbone.View.extend({
tagName: 'div',
el: '#updateSubscriber',
template: _.template($('#subscriberEdit-tmpl').html()),
initialize: function() {
this.model.on('sync', this.render, this);
},
events: {
'click #close': 'cancel',
'click .save-subscriber': 'update'
},
update: function() {
var $login = this.$('#login');
this.model.save({
login: $login.val(),
},
{
dataType: 'text',
success: function (model, response, options) {
console.log('success');
},
error: function (model, response, options) {
console.log('error');
}
});
},
cancel: function() {
$('#addSubscriber').fadeIn();
$('#editInner').fadeOut();
},
render: function() {
var html = this.template(this.model.toJSON());
this.$el.html(html);
},
});
如果有人能提供帮助,我们将不胜感激。 干杯
问题是el: '#updateSubscriber',
。您所有的视图实例都指向委托事件的同一元素。所以点击任何 .save-subscriber
将触发所有视图实例的更新。您不应为将具有多个实例的视图指定 el
。