这个问题我想了好久,似乎也想不出一个合理的解决方案。我想做的是在我的视图中为文本字段/它的值创建 getter/setter。我意识到首选的 Ext JS 方式是在控制器中使用引用并以这种方式获取它,但这对我来说并不是非常面向对象的。我还必须包装这些 getter 和 setter,因为如果 getter 返回未定义,我想输出一条消息。我想做的是创建自己的 getter/setter 或以某种方式覆盖默认的 getter/setter。以下是我正在考虑实现这一目标的一些方法。
我在想我可以使用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();
}
});
这行得通,我意识到这是一件非常挑剔的事情,但是在控制器中使用 getter 感觉不对。如果它在窗口中,我觉得它会更加面向对象。但是,如果我把它放在窗口中,我相信我唯一的选择是依靠 ids 或在窗口的 initComponent 中手动创建文本字段——这将涉及保存那里对文本字段的引用,但这似乎有点低效...因为我也必须调用 doLayout 。
重申一下,我希望在 Window 中有 getter/setter,并且我正在寻找一种快速引用它的方法,类似于控制器引用对象的方式。我相信主要的答案是使用 ids 并在窗口中调用Ext.ComponentQuery.query('#loginUserInput')
,但我想知道是否有更好的方法......比如覆盖自动生成的 getter/setter 或添加一个简单的 getter /setter 用于输入的值。
来自Sencha 论坛的交叉帖子。
编辑
我想我有点不清楚我想要什么。作为更一般的陈述,我不想将所有与我的视图相关的东西都塞进控制器中,而是将它们全部存储在视图本身中,其中包括诸如 getter/setter 之类的东西。其中一个 getter/setter 恰好是 loginUserInput getter。
使用模型是一个有趣的想法,但我觉得这对于单例值来说是一大笔开销。我基本上是在 LoginWindow 视图中寻找类似于 Java 的setter/getter的东西......并希望像 Java 一样简单(或接近)。
将它包含(封装)在视图中的想法使控制器更干净一些,如果我删除视图,我也会删除它的功能,所以我不必去寻找控制器中的功能。 ..我所要担心的是删除引用(应该是最少的)。