我是Marionette.js的新手,当我重构现有的Backbone.js代码时,我注意到Marionette视图(itemview)上有两个回调类似于我,即onRender和onShow。使用它们有什么区别和更好的方法?
但是,查看源代码,我认为“渲染”和“显示”事件都是在“视图初始化”中引发的。
constructor: function(){
_.bindAll(this, "render");
var args = Array.prototype.slice.apply(arguments);
Backbone.View.prototype.constructor.apply(this, args);
Marionette.MonitorDOMRefresh(this);
this.listenTo(this, "show", this.onShowCalled, this);
}
答案 0 :(得分:41)
我认为Vitaliy的回答中有些不完全正确。正确的将是:
onShow:视图本身不会触发'show'事件。它由一个地区触发。因此在某些情况下不会被调用。
onRender:每次渲染视图时都会执行此方法。
请注意,'onRender'正在执行并不意味着该对象实际上已添加到DOM 。它只是意味着它只是渲染(数据填充模板,你有一个。$ el来处理等)。
另一方面,如果'onShow'被调用,因为'show'事件已从某个区域触发,并且区域通常代表该区域内的元素DOM,您可能希望在调用'onShow'时,视图确实被添加到DOM中。
答案 1 :(得分:19)
onShow
:视图本身不会触发'show'事件。它由一个地区触发。因此在某些情况下不会被调用。
onRender
:每次渲染视图时都会执行此方法。
答案 2 :(得分:7)
嗯,这是Marionette中的show
方法,它解释了问题
show: function(view){
this.ensureEl();
var isViewClosed = view.isClosed || _.isUndefined(view.$el);
var isDifferentView = view !== this.currentView;
if (isDifferentView) {
this.close();
}
view.render();
if (isDifferentView || isViewClosed) {
this.open(view);
}
this.currentView = view;
Marionette.triggerMethod.call(this, "show", view);
Marionette.triggerMethod.call(view, "show");
}
答案 3 :(得分:0)
在版本3中,区域事件显示和之前:show不再被触发 在视图上。在大多数情况下,您可以使用render和before:render事件。如果 你需要知道视图在DOM中,然后你可以使用attach或dom:refresh
info http://blog.marionettejs.com/2016/08/23/marionette-v3/index.html