首先,我将对我的评论表明立场:
@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 提供的所有类都非常清楚他们期望的配置属性并处理它们。
例如,网格的存储属性由 解析,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
例子被简化了,解决配置并不总是那么容易。
结论
总是把你的类定义写成配置!除了普通配置之外,它们不得包含任何引用的实例,并且必须在创建实例时处理这些实例以解决它们。
免责声明
我并没有声称用这篇非常简短的文章来涵盖所有内容!