私がオンラインで見つけたSenchaTouchの例の多くは、適切なビューのカプセル化に焦点を当てていません。そのため、ボタンがビュー内に深くネストされている場合でも、コントローラーはすべてのボタンのイベントをリッスンします。言い換えれば、ビューの内部がリークし、それは決して良いことではありません。
地元のイベントに耳を傾け、意味のあるビジネスイベントなどを提起する意味のあるビューを作成することを奨励する1つの優れたチュートリアルを見つけました。
http://miamicoder.com/2012/how-to-create-a-sencha-touch-2-app-part-2/
ただし、これまで実際に理解できなかったことの1つは、ネストされたコンポーネントインスタンスを最適にキャッシュする方法です。この例を考えてみましょう。
Ext.define("NotesApp.view.NotesListContainer", {
extend: "Ext.Container",
alias: "widget.noteslistcontainer",
initialize: function () {
this.callParent(arguments);
var newButton = {
xtype: "button",
text: 'New',
ui: 'action',
handler: this.onNewButtonTap,
scope: this
};
var topToolbar = {
xtype: "toolbar",
title: 'My Notes',
docked: "top",
items: [
{ xtype: 'spacer' },
newButton
]
};
this.add([topToolbar]);
},
onNewButtonTap: function () {
console.log("newNoteCommand");
this.fireEvent("newNoteCommand", this);
},
config: {
layout: {
type: 'fit'
}
}
});
にメソッドを追加したいとsetSpecialUIState
しますNotesListContainer
。それが呼び出されたとき、私たちは何かをしたいですnewButton
(例えばそれを隠す)。newButton
悪用せずにインスタンスにアクセスするにはどうすればよいExt.getComp()
ですか?インスタンス変数として設定できますか?正規の方法はどうですか?
アップデート
Nikolaj Borisikが提案したように、私はこれを試しました。
this._newButton = this.add([{
xtype: "button",
text: 'New',
ui: 'action',
handler: this.onNewButtonTap,
scope: this
}];
それは魅力のように機能します。そうするのが慣用的であるかどうか、または私が見逃しているかもしれない欠点があるかどうかはわかりません。それ以外の場合は、これを行うことを強くお勧めします。Senchaはさておき、一貫性のあるUIパーツを抽象化する意味のあるビューを作成する方がはるかに優れています。これは、すべてのボタンをコントローラーにリークして直接いじるよりもはるかに優れています。
それで、このアプローチの欠点はあるのだろうか?