开发ExtJS应用组件之间引用是个一个比较麻烦的事情。比如在一个FormPanel的底部工具条的某个按钮的事件处理函数中引用form的某个field基本上有两方法:
方法1虽然很简单,很容易实现,但这样的form不能复用。方法2比较麻烦,而且如果form的layout改变了或者有新的字段,那么引用代码需要重写。
针对这种情况,ExtJS推出了ref配置属性,凡是component都可以使用该属性在它的归属容器及归属容器的父节点中注入一个对该属性的引用名称。有了该引用名,和该组件有共同父节点的组件就可以比较方便的引用该组件。
以下示例摘自ExtJS官方文档:
var myGrid = new Ext.grid.EditorGridPanel({ title: 'My EditorGridPanel', store: myStore, colModel: myColModel, tbar: [{ text: 'Save', handler: saveChanges, disabled: true, ref: '../saveButton' }], listeners: { afteredit: function() { // The button reference is in the GridPanel myGrid.saveButton.enable(); } } });
这个例子中定义了一个可编辑的网格面板,该面板的afteredit事件处理程序需要引用顶部工具栏上的“Save"按钮。如果不用ref配置属性来解决引用问题的话,根据上文提到的两个方法,要么给Save按钮一个唯一标识,然后再afteredit事件处理函数中用Ext.getCmp()获得对该按钮的引用,要么用以下代码:
var myGrid = new Ext.grid.EditorGridPanel({ title: 'My EditorGridPanel', store: myStore, colModel: myColModel, tbar: [{ text: 'Save', handler: saveChanges, disabled: true, ref: '../saveButton' }], listeners: { afteredit: function() { // The button reference is in the GridPanel myGrid.getTopToolbar().get(0).enable(); } } });
这个方法不太理想,当layout发生变化时需要修改get()的索引。比如在Save按钮前加入一个分隔符,那么get(0)需要改成get(1):
var myGrid = new Ext.grid.EditorGridPanel({ title: 'My EditorGridPanel', store: myStore, colModel: myColModel, tbar: [ '-', { text: 'Save', handler: saveChanges, disabled: true, ref: '../saveButton' }], listeners: { afteredit: function() { // The button reference is in the GridPanel myGrid.getTopToolbar().get(1).enable(); } } });
Ext3.x的ref是个不错的东东,可以省了不少getCmp(),但它的文档太少,有个问题需注意:
ref:’../'表示定义为当前父组件的父组件的子件,例如:
var grid = new Ext.grid.GridPanel{
....
tbar: [{
xtype: 'xxxx',
ref: '../xxxx’
}]
}
则可用grid.xxxx来取xxxx组件并操作,而不是取grid.tbar.xxxx;
如果把ref定义改为 ref: ‘xxxx’,则要用grid.tbar.xxxx来操作;
ref相当于定义了一个路径.
另外items相当于一个数组,不是组件,例如:
var form=new Ext.form.FormPanel{
....
items: [{
xtype: 'xxxx',
ref: 'xxxx’
}]
}
这里则可用form.xxxx取xxxx组件…