私はばかげた問題を抱えています。私の唯一の解決策は、他の問題を引き起こしているずさんなハックです。
またはここでコードを読んでください:
HTML:
<input id='1' value='input1' />
<template id='template1'>
<input id='2' value='input2' />
</template>
JS - アイテム ビュー宣言:
// Declare an ItemView, a simple input template.
var Input2 = Marionette.ItemView.extend({
template: '#template1',
onRender: function () {
console.log('hi');
},
ui: { input2: '#2' },
onRender: function () {
var self = this;
// Despite not being in the DOM yet, you can reference
// the input, through the 'this' command, as the
// input is a logical child of the ItemView.
this.ui.input2.val('this works');
// However, you can not call focus(), as it
// must be part of the DOM.
this.ui.input2.focus();
// So, I have had to resort to this hack, which
// TOTALLY SUCKS.
setTimeout(function(){
self.ui.input2.focus();
self.ui.input2.val('Now it focused. Dammit');
}, 1000)
},
})
JS-コントローラー
// To start, we focus input 1. This works.
$('#1').focus();
// Now, we make input 2.
var input2 = new Input2();
// Now we 1. render, (2. onRender is called), 3. append it to the DOM.
$(document.body).append(input2.render().el);
上記でわかるように、私の問題は、ビューがonRender
まだDOMに追加されていないため、ビューがレンダリングされた後()、それ自体にフォーカスを当てることができないことです。私の知る限り、 などと呼ばれる他のイベントはありませんonAppend
。これにより、実際に DOM に追加されたことを検出できます。
ItemView の外からフォーカスを呼び出したくありません。それは私の目的のために内部から行われなければなりません。
明るいアイデアはありますか?
アップデート
onShow()
CollectionView、CompositeView、Region など、Marionette.js のすべての DOM 追加で呼び出されますが、ドキュメントにはありません。
ありがとう、ルカシュフィッツァー。