【发布时间】:2012-09-17 14:48:58
【问题描述】:
我在网上找到了很多 Sencha Touch 示例,并没有真正关注正确的视图封装。因此,即使按钮深嵌套在视图中,控制器也会监听每个按钮的事件。换句话说,视图的内部泄漏从来都不是一件好事。
我找到了一个很好的教程,它鼓励您创建有意义的视图来监听本地事件并引发有意义的业务事件等。
http://miamicoder.com/2012/how-to-create-a-sencha-touch-2-app-part-2/
但是,到目前为止,我无法真正弄清楚的一件事是如何最好地缓存嵌套的组件实例。考虑这个例子:
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'
}
}
});
假设我们想在NotesListContainer 中添加一个方法setSpecialUIState。当它被调用时,我们想对newButton 做一些事情(例如隐藏它)。我如何在不滥用Ext.getComp() 的情况下访问newButton 实例?我可以将其设置为实例变量吗?规范的方式如何?
更新
我只是按照 Nikolaj Borisik 的建议尝试了这个。
this._newButton = this.add([{
xtype: "button",
text: 'New',
ui: 'action',
handler: this.onNewButtonTap,
scope: this
}];
这就像一个魅力。我只是不知道这样做是否符合习惯,或者是否有任何我可能遗漏的缺点。否则我强烈建议这样做。撇开 Sencha 不谈,编写有意义的视图来抽象出连贯的 UI 部分要好得多。这比将每个按钮都泄漏到控制器并直接摆弄它们要好得多。
所以我想知道这种方法是否有任何缺点?
【问题讨论】:
-
我完全支持你,但写控制器的方法是错误的...负责的事件总线覆盖所有组件的 fireEvent 方法,以便它们首先调用事件总线调度程序!
-
感谢您的澄清。我试图改进那部分。更好的?如果没有,请随意调整它;-) 你说“我完全支持你”。太好了,我们一起跳桥吧。不好玩,你不喜欢提交另一个答案吗?听听其他 Sencha/ExtJS 用户的观点会很好。我不可能是唯一一个喜欢用 Sencha/ExtJS 编写有意义的、连贯的视图组件的人。
标签: extjs4 sencha-touch sencha-touch-2