`

ExtJS ref属性之应用

ext 
阅读更多

开发ExtJS应用组件之间引用是个一个比较麻烦的事情。比如在一个FormPanel的底部工具条的某个按钮的事件处理函数中引用form的某个field基本上有两方法:

 

  1. 为每个field赋予一个ID,然后用Ext.getCmp(ID)
  2. 从用findParentByType找到FormPanel然后再用get()根据field出现的顺序去找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组件…

分享到:
评论

相关推荐

    EXTjs 文件上传(可用)

    EXTjs 是一个强大的JavaScript库,专门用于构建富客户端应用程序,尤其在企业级Web应用中广泛应用。Strut2,则是基于MVC模式的Java Web框架,它简化了开发过程,提供了丰富的功能,使得开发者能够轻松地处理HTTP请求...

    struts2+extjs3 单/多文件上传

    Struts2和ExtJS3是两个非常流行的开源框架,它们在Web开发中有着广泛的应用。Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,而ExtJS3则是一个用于构建富客户端JavaScript应用的库。本文将...

    extjs帮助文档pdf版

    - **概述**:`Ext` 是 ExtJS 的核心命名空间,包含了全局的方法和属性。 - **用途**:提供了一个统一的入口来访问 ExtJS 库的功能,如创建组件、管理事件等。 - **常用方法**: - `Ext.create()`: 创建一个组件实例...

    extjs帮助文档

    - **概述**:Ext类是ExtJS的核心基础类之一,它提供了一系列用于简化DOM操作和浏览器兼容性问题的方法。 - **常用方法**: - `Ext.isEmpty(value)`:检查给定值是否为空或未定义。 - `Ext.isObject(value)`:判断...

    ext4.1 mvc 模式

    2. **模型(Model)**:在EXTJS中,模型定义了数据对象的属性和行为。例如,你可以定义一个用户模型,包含用户名、邮箱等字段,并添加验证规则。 ```javascript Ext.define('User', { extend: 'Ext.data.Model', ...

    解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题

    总的来说,解决Firefox中ExtJS关闭窗口后再打开后iframe中js函数访问不到的问题,关键在于正确地获取和使用iframe的`contentWindow`属性。同时,了解并遵循同源策略以及适时使用跨域通信技术,对于开发健壮的Web应用...

Global site tag (gtag.js) - Google Analytics