この問題についてしばらく考えていましたが、合理的な解決策が思い浮かびません。私がやりたいのは、ビュー内のテキストフィールド/その値のゲッター/セッターを作成することです。推奨される Ext JS の方法は、コントローラー内で参照を使用し、その方法で取得することだと認識していますが、それはあまりオブジェクト指向ではないように感じます。ゲッターが未定義を返した場合にメッセージを出力したいので、これらのゲッターとセッターもラップする必要があります。私がやりたいのは、独自のゲッター/セッターを作成するか、デフォルトのゲッター/セッターをオーバーライドすることです。これを達成するために私が考えていたいくつかの方法があります。
を使用できると思ってconfig {}
いましたが、定義したい変数に対してのみ機能するようです。それから私はどうにかしてIDを使用することを考えていましたが、コミュニティはそれが良い習慣であるかどうかで分かれているようです. これが私の現在の解決策につながります...ラッピング。これが私のコードです:
ログインウィンドウ
Ext.define('MyApp.view.LoginWindow', {
extend: 'Ext.window.Window',
alias: 'widget.loginWindow',
autoShow: true,
closable: false,
border: 0,
plain: true,
allowBlank: false,
title: "Enter your username",
modal: true,
config: {
buttons: [{
text: "Ok"
}],
items: [{
xtype: 'textfield',
fieldLabel: 'Username',
id: 'loginUserInput',
name: 'loginUserInput',
msgTarget: 'under',
validator: function(value) {
if (Ext.isEmpty(value)) {
return "You need to enter a username.";
}
return true;
}
}]
},
constructor: function(config) {
this.callParent(config);
},
getButton: function() {
console.log('here');
}
});
マイコントローラー
Ext.define('MyApp.controller.Chat', {
extend: 'Ext.app.Controller',
requires: [
'Views.ChatModule.view.LoginWindow'
],
refs: [{
ref: 'loginWindow',
selector: 'loginWindow',
xtype: 'loginWindow',
autoCreate: true
}, {
ref: 'loginUserInput',
selector: '#loginUserInput'
}],
init: function() {
// The events controller oversees
this.control({
'loginWindow button[text="Ok"]': {
'click': this.onSubmitLoginWindow
}
});
},
getLoginUserInputValue: function() {
var loginUserInput = this.getLoginUserInput();
if (loginUserInput) {
var username = loginUserInput.getValue();
if (username) {
console.log(username);
} else {
console.warn("username is undefined");
}
}
console.warn("loginUserInput is undefined");
},
onSubmitLoginWindow: function(button, event, eOpts) {
this.getLoginUserInputValue();
}
});
これは機能し、非常に細かいことだと思いますが、コントローラーにゲッターを入れるのは適切ではありません。ウィンドウにあれば、よりオブジェクト指向になる気がします。ただし、ウィンドウに配置する場合、唯一のオプションは、ID に依存するか、ウィンドウの initComponent に手動でテキスト フィールドを作成することだと思います。 ... doLayout も呼び出す必要があるためです。
繰り返しますが、ウィンドウにゲッター/セッターがあればいいのですが、コントローラーがオブジェクトを参照する方法と同様に、それを参照する簡単な方法を探しています。主な答えは、id を使用Ext.ComponentQuery.query('#loginUserInput')
してウィンドウ内で呼び出すことだと思いますが、自動生成されたゲッター/セッターをオーバーライドしたり、単純なゲッターを追加したりするなど、より良いアプローチがあるかどうかを知りたいです。 /入力値のセッター。
Sencha フォーラムからのクロスポスト。
編集
私は自分が何を望んでいるのか少し不明確だったと思います。より一般的なステートメントとして、ビューに関連するすべてのものをコントローラーに詰め込むのではなく、ゲッター/セッターなどを含むビュー自体にすべてを格納したいと考えています。これらのゲッター/セッターの 1 つは、たまたま loginUserInput ゲッターです。
モデルを使用するのは興味深いアイデアですが、シングルトン値のオーバーヘッドが非常に大きくなると思います。私は基本的に、LoginWindow ビューでJava のセッター/ゲッターのようなものを探しています...そしてできれば Java と同じくらい (またはそれに近い) シンプルなものを探しています。
ビューに含める (カプセル化する) ことで、コントローラーが少しすっきりします。ビューを削除すると、その関数も削除されるので、コントローラー内の関数を探す必要がなくなります。 ..私が心配しなければならないのは、参照を削除することだけです(これは最小限にする必要があります)。