我不确定您是否应该出于各种不同的原因。
但我知道,在单个标签视图的用例中,Marionette/Backbone 的工作方式是您创建另一个标签并拥有一个视图,或者您使用 onRender 和查询来更新已经为您生成的单个标签。
您可以拥有一个扩展 ItemView 的对象,我们称之为 SingleTagView。基本上我正在扩展 ItemView 并使用一次更改来超越它的渲染功能。
而不是这样做:
this.$el.html(html);
我在做:
var $html = $(html);
this.$el.replaceWith($html);
this.setElement($html);
这是代码:
var SingleTagView = Marionette.ItemView.extend({
render: function() {
this.isClosed = false;
this.triggerMethod("before:render", this);
this.triggerMethod("item:before:render", this);
var data = this.serializeData();
data = this.mixinTemplateHelpers(data);
var template = this.getTemplate();
var html = Marionette.Renderer.render(template, data);
// above is standart ItemView code
var $html = $(html);
this.$el.replaceWith($html);
this.setElement($html);
// this code above replaced this.$el.html(html);
// below is standart ItemView code
this.bindUIElements();
this.triggerMethod("render", this);
this.triggerMethod("item:rendered", this);
return this;
}
});
如果要使用这种角度,请确保正确测试行为(事件处理、Dom 泄漏、使用 before:render 事件的不同流程)。