18

我是 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

4 回答 4

41

我认为 Vitaliy 的回答有些不完全正确。正确的将是:

onShow :视图本身不会触发“显示”事件。它由一个地区触发。所以在某些情况下它不会被调用。

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

请注意,正在执行的“onRender”并不意味着该对象实际上已添加到 DOM中。它只是意味着它刚刚被渲染(数据填充了模板,你有一个 this.$el 来处理,等等)

另一方面,如果'onShow'被调用是因为'show'事件已从一个区域触发,并且由于区域通常代表 DOM 中的一个元素,你可能会期望当调用'onShow'时,视图确实是添加到 DOM。

于 2013-12-02T17:55:31.933 回答
20

onShow:视图本身不会触发“显示”事件。它由一个地区触发。所以在某些情况下它不会被调用。

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

于 2013-06-14T18:31:37.890 回答
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");
     }
于 2013-06-18T16:48:52.927 回答
0

在版本 3 中,区域事件 show 和 before:show 不再在视图上触发。在大多数情况下,您可以使用 render 和 before:render 事件。如果您需要知道视图在 DOM 中,那么您可以使用 attach 或 dom:refresh

信息http://blog.marionettejs.com/2016/08/23/marionette-v3/index.html

于 2016-11-15T17:53:43.840 回答