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

时间:2013-06-14 17:47:51

标签: backbone.js view marionette

我是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);
}

4 个答案:

答案 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