UI要素に関するBackbone.Marionetteの見解の背後にある決定を理解したいと思います。次のように、既存のDOM要素でMarionette.Viewをインスタンス化する場合:
_view = new Marionette.ItemView({
el: "#element",
ui : {
whatever : "#whatever"
}
});
_
これまでのところ、_view.$el
_内のjqueryセレクターである_view.initialize
_にアクセスできます。ただし、_view.ui.whatever
_にアクセスしようとすると、セレクター、つまり実際の$("#whatever")
jqueryセレクターではなく文字列 "#whatever"にしかアクセスできません。
これは、Marionette.View.bindUIElements()
がrender
でのみ呼び出され、initialize
の前では呼び出されないためです。
この振る舞いが論理的であると思うかどうか、そしてその理由を知りたいですか?
ビューを既存のel
にアタッチする場合にのみ質問しています。ビューがテンプレートを使用して作成されている場合、バインディングがrender()
にある理由を理解しています。
ビューを既存の要素にアタッチすることは例外です。通常のビューのライフサイクルにはrender
の呼び出しが含まれ、これを行わないと、UI要素をバインドすることはできません。
既存の要素にビューをアタッチする必要がある場合は、initialize
メソッドでthis.bindUIElements()
を呼び出すだけです。
Marionetteを使用しているときは、ui要素にアクセスする必要のあるコードをonShowメソッド内に配置します。このイベントは、DOMの準備が整い、要素を操作する準備ができた後に発生します。このメソッド内では、ui.whateverが文字列ではなく要素を指しているようになります。
JQuery要素にアクセスする必要があるため、この問題があると思います。
this.ui.whatever
「これ」はすでにビューインスタンスであるためです。参照: http://marionettejs.com/docs/v2.4.4/marionette.itemview.html#organizing-ui-elements