add*_*isu 18 view backbone.js marionette
我是Marionette.js的新手,当我重构现有的Backbone.js代码时,我注意到Marionette视图(itemview)上有两个回调类似于我,即onRender和onShow.使用它们有什么区别和更好的方法?
但是,查看源代码,我认为"render"和"show"事件都是在"view initialize"中引发的.
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);
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*son 41
我认为在Vitaliy的回答中有一些不完全正确的东西.正确的将是:
onShow:视图本身不会触发'show'事件.它由一个地区触发.所以在某些情况下不会被调用.
onRender:每次渲染视图时都会执行此方法.
请注意,正在执行的'onRender' 并不意味着该对象实际上已添加到DOM中.它只是意味着它只是渲染(数据填充模板,你有一个.$ el来处理,等等)
另一方面,如果'onShow'被调用是因为'show'事件是从一个区域触发的,并且由于区域通常代表DOM中的一个元素,你可能会期望当'onShow'被调用时,视图确实是添加到DOM.
Vit*_*huk 19
onShow
:视图本身不会触发'show'事件.它由一个地区触发.所以在某些情况下不会被调用.
onRender
:每次渲染视图时都会执行此方法.
嗯,这是show
Marionette 的方法,它解释了这个问题
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");
}
Run Code Online (Sandbox Code Playgroud)