marionette.js查看onShow与onRender之间的差异?

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.

  • 为什么不改善答案? (2认同)
  • 对不起,我不知道我能做到这一点:/我只是编辑答案并改变它,或者我需要做更多的事情?再次,我的道歉:( (2认同)

Vit*_*huk 19

onShow:视图本身不会触发'show'事件.它由一个地区触发.所以在某些情况下不会被调用.

onRender :每次渲染视图时都会执行此方法.

  • 不,`ItemView`(从`View`扩展)只是订阅`show`事件 - `this.listenTo(this,"show",this.onShowCalled,this);`并且不会触发它.`render`事件触发`render`方法,而不是`view initialize`.所以它可以随时手动调用. (3认同)

add*_*isu 7

嗯,这是showMarionette 的方法,它解释了这个问题

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)