我通常倾向于将尽可能多的配置放在类配置选项中,因为这样更易于阅读并且更容易在子类中进行覆盖。此外,未来 Sencha Cmd 很有可能会有一种优化编译器,因此,如果您保持代码的声明性,它可能会受益于优化。
比较:
Ext.define('MyPanel', {
extend: 'Ext.grid.Panel',
initComponent: function() {
this.callParent();
this.store = new Ext.data.Store({
fields: [ ... ],
proxy: {
type: 'direct',
directFn: Direct.Store.getData
}
});
this.foo = 'bar';
}
});
...
var panel = new MyPanel();
而且:
Ext.define('MyPanel', {
extend: 'Ext.grid.Panel',
alias: 'widget.mypanel',
foo: 'bar',
store: {
fields: [ ... ],
proxy: {
type: 'direct',
directFn: 'Direct.Store.getData'
}
}
});
...
var panel = Ext.widget({
xtype: 'mypanel',
foo: 'baz'
});
注意这些方法是非常不同的。在第一个例子中,我们在硬编码很多东西:对象属性值,存储配置,使用MyPanel类的名称;我们实际上扼杀了类的概念,因为它变得不可扩展。而在第二个例子中,我们创建了一个可以重复使用的
模板,可能具有不同的配置 - 基本上,那就是整个类系统的内容。
然而,实际上的区别更深层次。在第一种情况下,我们实际上是将类配置推迟到运行时,而在第二种情况下,我们是
定义类配置并在非常不同的阶段
应用它。实际上,我们可以轻易地说,第二种方法引入了JavaScript原生缺少的东西:编译时间阶段。它给我们带来了大量的可能性,这些可能性在框架代码本身中得到了利用;如果您想要一些示例,请查看最新的4.2 beta中的
Ext.app.Controller
和
Ext.app.Application
。
从更实际的角度来看,第二种方法更好,因为它更容易阅读和处理。一旦你掌握了这个想法,你会发现自己写所有的代码都像这样,因为这样做更容易。
这样看待它:如果你写一个旧式的Web应用程序,在服务器端生成HTML和其他东西,你会尝试不在代码中混杂任何HTML,对吧?模板在左边,代码在右边。这与在
initComponent
中硬编码数据几乎相同:当然可以工作,但只能到一定程度。然后它变成了一碗意大利面条,难以维护和扩展。哦,还有测试所有这些!恶心。
现在
有时候您需要在运行时对实例进行操作,而不是类定义时间 - 经典的示例是应用事件侦听器或在控制器中调用
control
。您将不得不从对象实例获取实际函数引用,并且您必须在
initComponent
或
init
中执行此操作。但是,我们正在努力解决这个问题 - 没有硬编码所有这些的硬要求;
Observable.on()
已经支持字符串侦听器名称,MVC之类的内容也很快就会支持。
正如我在上面的评论中所说,我将不得不为文档编写一篇文章或指南,解释事情。这可能要等到4.2发布才行;与此同时,这个答案应该能够对这个问题有所启示。