我刚刚使用显示模态编辑框的主干做了一些事情,您可以在其中编辑项目的名称。由于这个名称也显示在主页上,我想同时更新它。但我不想识别 DOM 元素并直接用我的编辑结果更新它。相反,我创建了一个主干模型:
this.newModel = new app.Project({model: this.model});
然后我听取新模型的任何更改,在本例中为 project_name 属性:
this.listenTo(this.newModel, 'change:project_name', this.updateName);
然后我使用“newModel”创建一个新视图
modal = new app.ProjectModal({
model: this.newModel,
});
然后显示它,如果模式视图中的名称发生更改,则在“父”视图中触发“this.updateName”函数,因此无需识别实际 DOM 元素的位置。
整个“父”函数如下所示:
app.ProjectCardView = Backbone.View.extend({
tagName: 'article',
className: 'project',
template: _.template( $("#tpl-project-card-summary").html() ),
events: {
'click .settings-btn': 'showProjectModal'
},
initialize: function() {
//a slightly different model is used to populate project than this card...
this.newModel = new app.Project({model: this.model});
return this;
},
render: function() {
this.$el.html( this.template(this.model.toJSON()) );
return this;
},
showProjectModal: function (e) {
this.listenTo(this.newModel, 'change:project_name', this.updateName);
this.modal = new app.ProjectModal({
model: this.newModel
});
return this;
},
updateName: function() {
if (this.modal) {
this.$el.find('.item_name').text(this.model.get("project_name"));
}
return this;
}
});
显然我必须在某处更新 DOM,但现在它与编辑分离并且更易于管理。