首先我要对我的评论表明立场:
@AlexanderTokarev 别误会我的意思。我不谈论组件的配置,或者更糟糕的实例并将它们移动到initComponent(),这不是我的意思。
现在我对此的看法。
initComponent() 应该解决实例所需的时间
这个类的创建。不多也不少。
在定义类时,您可能会搞砸负载,而且大多数情况都是因为人们不了解 ExtJS 类系统的工作原理。由于这是关于组件的,因此以下将重点关注这些。这也是一个简化的例子,它应该只显示一种我见过很多次的错误。
让我们开始吧:我们有一个自定义面板,它可以做很多漂亮的事情。这就需要自定义配置,我们称之为foo。我们将它与我们的默认配置选项一起添加到类定义中,以便我们可以访问它:
Ext.define('Custom', {
extend: 'Ext.panel.Panel',
alias: 'widget.custpanel',
foo: {
bar: null
},
initComponent: function() {
this.callParent(arguments);
}
});
但是测试后事情变得很奇怪。我们的配置值似乎发生了神奇的变化。这是一个JSFiddle
发生的事情是所有创建的实例都引用同一个foo 实例。但最近我做到了
store: {
fields: [ ... ],
proxy: {
type: 'direct',
directFn: 'Direct.Store.getData'
}
}
有一家商店,效果很好。那么为什么foo 不起作用呢?
大多数人看不出这个小foo 对象和(ExtJS)配置之间有任何区别,这基本上是正确的,因为两者都是对象(实例)。但不同之处在于,所有由 sencha 提供的类都非常清楚他们期望和处理的配置属性。
例如,网格的 store 属性由 StoreManager 解析,因此可以是:
-
storeId 字符串,或
- 存储实例或
- 存储配置对象。
在网格初始化期间,其中任何一个都会被实际的商店实例解析和覆盖。商店只是一个例子。我想更广为人知的是 items 数组。这是一个定义时的数组,每个实例都会使用 MixedCollection 覆盖它(如果我没记错的话)。
是的,类定义和从它创建的实例之间存在差异。但是我们需要处理任何包含像上面的foo 这样的引用的新属性,这并不复杂。这是我们需要为foo 示例修复它的方法
Ext.define('Custom', {
extend: 'Ext.panel.Panel',
alias: 'widget.custpanel',
foo: {
bar: null
},
initComponent: function() {
this.foo = Ext.apply({}, this.foo);
this.callParent(arguments);
}
});
这是JSFiddle
现在我们在创建实例时处理foo 配置。现在这个foo 示例已经简化,解析配置并不总是那么容易。
结论
始终将您的类定义写为配置!他们不得
包含除普通配置外的任何引用实例,并且必须
在创建实例时处理这些问题以解决它们。
免责声明
我并没有声称用这篇非常短的文章来涵盖所有内容!