私はMarionette.jsを初めて使用し、既存のBackbone.jsコードをリファクタリングしているときに、Marionetteビュー(itemview)に2つのコールバック(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);
}
onShow
:ビュー自体は「表示」イベントをトリガーしません。地域によってトリガーされます。したがって、場合によっては呼び出されません。
onRender
:このメソッドは、ビューがレンダリングされるたびに実行されます。
Vitaliyの答えには完全に正しくないものがあると思います。正しいものは次のとおりです。
onShow:ビュー自体は「表示」イベントをトリガーしません。地域によってトリガーされます。したがって、場合によっては呼び出されません。
onRender:このメソッドは、ビューがレンダリングされるたびに実行されます。
'onRender'が実行されていることに注意してくださいオブジェクトが実際にDOMに追加されることを意味するわけではありません。それは単にレンダリングされたことを意味するだけです(テンプレートにデータが入力され、処理するthis。$ elなどがあります)。
一方、'show'イベントがリージョンからトリガーされたため、 'onShow'が呼び出された場合、および通常、リージョンはDOM内の要素を表すため、 'onShow'が呼び出されると、ビューが実際にDOMに追加されることが予想されます。
まあ、これはマリオネットの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では、領域イベントshowおよびbefore:showはビューでトリガーされなくなりました。ほとんどの場合、renderおよびbefore:renderイベントを使用できます。ビューがDOMにあることを知る必要がある場合は、attachまたはdom:refreshを使用できます
info http://blog.marionettejs.com/2016/08/23/marionette-v3/index.html