`
czpae86
  • 浏览: 720525 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一个Ext.DataView / Ext.ListView扩展

 
阅读更多

在sencha论坛看到的扩展:


例子:

Ext.onReady(function() {
    new Ext.Viewport({
        layout: 'hbox',
        layoutConfig: {
            align: 'stretch'
        },
        defaults: {
            flex: 1
        },
        items: [{
            title: 'ComponentDataView example',
            items: {
                xtype: 'compdataview',
                store: [[1, 'One'], [2, 'Two'], [3, 'Three']],
                itemSelector: 'tbody tr',
                tpl: '<table><thead><tr><td>Value</td><td>Text</td></tr></thead><tbody><tpl for="."><tr><td></td><td></td></tr></tpl></tbody></table>',
                items: [{
                    xtype: 'numberfield',
                    minValue: 0,
                    maxValue: 100,
                    renderTarget: 'td:nth(1)',
                    applyValue: 'field1'
                },{
                    allowBlank: false,
                    renderTarget: 'td:nth(2)',
                    applyValue: 'field2'
                }]
            }
        },{
            title: 'ComponentListView example',
            items: {
                xtype: 'complistview',
                store: [[1, 'One'], [2, 'Two'], [3, 'Three']],
                columns: [{
                    header: 'Value',
                    width: .5,
                    dataIndex: 'field1',
                    tpl: ' ',
                    component: {
                        xtype: 'button',
                        text : 'test'
                    }
                },{
                    header: 'Text',
                    width: .5,
                    dataIndex: 'field2',
                    tpl: ' ',
                    component: {
                        allowBlank: false,
                        applyValue: true
                    }
                }]
            }
        }]
    });
});

 

扩展代码:

Ext.ns('Ext.ux');
Ext.ux.ComponentDataView = Ext.extend(Ext.DataView, {
    defaultType: 'textfield',
    initComponent : function(){
        Ext.ux.ComponentDataView.superclass.initComponent.call(this);
        this.components = [];
    },
    refresh : function(){
        Ext.destroy(this.components);
        this.components = [];
        Ext.ux.ComponentDataView.superclass.refresh.call(this);
        this.renderItems(0, this.store.getCount() - 1);
    },
    onUpdate : function(ds, record){
        var index = ds.indexOf(record);
        if(index > -1){
            this.destroyItems(index);
        }
        Ext.ux.ComponentDataView.superclass.onUpdate.apply(this, arguments);
        if(index > -1){
            this.renderItems(index, index);
        }
    },
    onAdd : function(ds, records, index){
        var count = this.all.getCount();
        Ext.ux.ComponentDataView.superclass.onAdd.apply(this, arguments);
        if(count !== 0){
            this.renderItems(index, index + records.length - 1);
        }
    },
    onRemove : function(ds, record, index){
        this.destroyItems(index);
        Ext.ux.ComponentDataView.superclass.onRemove.apply(this, arguments);
    },
    onDestroy : function(){
        Ext.ux.ComponentDataView.onDestroy.call(this);
        Ext.destroy(this.components);
        this.components = [];
    },
    renderItems : function(startIndex, endIndex){
        var ns = this.all.elements;
        var args = [startIndex, 0];
        for(var i = startIndex; i <= endIndex; i++){
            var r = args[args.length] = [];
            for(var items = this.items, j = 0, len = items.length, c; j < len; j++){
                c = items[j].render ?
                    c = items[j].cloneConfig() :
                    Ext.create(items[j], this.defaultType);
                r[j] = c;
                if(c.renderTarget){
                    c.render(Ext.DomQuery.selectNode(c.renderTarget, ns[i]));
                }else if(c.applyTarget){
                    c.applyToMarkup(Ext.DomQuery.selectNode(c.applyTarget, ns[i]));
                }else{
                    c.render(ns[i]);
                }
                if(Ext.isFunction(c.setValue) && c.applyValue){
                    c.setValue(this.store.getAt(i).get(c.applyValue));
                    c.on('blur', function(f){
                    	this.store.getAt(this.index).data[this.dataIndex] = f.getValue();
                    }, {store: this.store, index: i, dataIndex: c.applyValue});
                }
            }
        }
        this.components.splice.apply(this.components, args);
    },
    destroyItems : function(index){
        Ext.destroy(this.components[index]);
        this.components.splice(index, 1);
    }
});
Ext.reg('compdataview', Ext.ux.ComponentDataView);

Ext.ux.ComponentListView = Ext.extend(Ext.ListView, {
    defaultType: 'textfield',
    initComponent : function(){
        Ext.ux.ComponentListView.superclass.initComponent.call(this);
        this.components = [];
    },
    refresh : function(){
        Ext.destroy(this.components);
        this.components = [];
        Ext.ux.ComponentListView.superclass.refresh.apply(this, arguments);
        this.renderItems(0, this.store.getCount() - 1);
    },
    onUpdate : function(ds, record){
        var index = ds.indexOf(record);
        if(index > -1){
            this.destroyItems(index);
        }
        Ext.ux.ComponentListView.superclass.onUpdate.apply(this, arguments);
        if(index > -1){
            this.renderItems(index, index);
        }
    },
    onAdd : function(ds, records, index){
        var count = this.all.getCount();
        Ext.ux.ComponentListView.superclass.onAdd.apply(this, arguments);
        if(count !== 0){
            this.renderItems(index, index + records.length - 1);
        }
    },
    onRemove : function(ds, record, index){
        this.destroyItems(index);
        Ext.ux.ComponentListView.superclass.onRemove.apply(this, arguments);
    },
    onDestroy : function(){
        Ext.ux.ComponentDataView.onDestroy.call(this);
        Ext.destroy(this.components);
        this.components = [];
    },
    renderItems : function(startIndex, endIndex){
        var ns = this.all.elements;
        var args = [startIndex, 0];
        for(var i = startIndex; i <= endIndex; i++){
            var r = args[args.length] = [];
            for(var columns = this.columns, j = 0, len = columns.length, c; j < len; j++){
                var component = columns[j].component;
                c = component.render ?
                    c = component.cloneConfig() :
                    Ext.create(component, this.defaultType);
                r[j] = c;
                var node = ns[i].getElementsByTagName('dt')[j].firstChild;
                if(c.renderTarget){
                    c.render(Ext.DomQuery.selectNode(c.renderTarget, node));
                }else if(c.applyTarget){
                    c.applyToMarkup(Ext.DomQuery.selectNode(c.applyTarget, node));
                }else{
                    c.render(node);
                }
                if(c.applyValue === true){
                	c.applyValue = columns[j].dataIndex;
                }
                if(Ext.isFunction(c.setValue) && c.applyValue){
                    c.setValue(this.store.getAt(i).get(c.applyValue));
                    c.on('blur', function(f){
                    	this.store.getAt(this.index).data[this.dataIndex] = f.getValue();
                    }, {store: this.store, index: i, dataIndex: c.applyValue});
                }
            }
        }
        this.components.splice.apply(this.components, args);
    },
    destroyItems : function(index){
        Ext.destroy(this.components[index]);
        this.components.splice(index, 1);
    }
});
Ext.reg('complistview', Ext.ux.ComponentListView);

 

 

 

  • 大小: 12.1 KB
分享到:
评论

相关推荐

    ExtJs xtype一览

    - **`cycle` (Ext.CycleButton)**: 此组件为一个带有下拉选项菜单的按钮。通常用于在一组预设选项中循环选择。 - **`buttongroup` (Ext.ButtonGroup)**: 自3.0版本开始支持,此组件用于将多个按钮组织在一起,形成一...

    extJs xtype 类型

    3. **`cycle`:** 此组件提供了一个带有下拉选项菜单的按钮,由`Ext.CycleButton`类实现。 4. **`buttongroup`:** 用于创建一组按钮,自3.0版本开始支持,通过`Ext.ButtonGroup`类实现。 5. **`slider`:** 滑动条...

    ExtJS3总结内容

    例如,要验证一个字段是否为有效的电子邮件地址,可以在`vtype`属性中设置为`email`: ```javascript new Ext.form.TextField({ fieldLabel: 'Email', name: 'email', vtype: 'email' }); ``` #### 结论 通过...

    ExtJs组件类的对应表

    4. **`buttongroup`** - `Ext.ButtonGroup`,自3.0版本起引入,用于创建一组关联的按钮,通常用于选择多个选项。 5. **`slider`** - `Ext.Slider`,滑动条组件,用于输入范围内的数值。 6. **`progress`** - `...

    Extjs xtype集合

    在Extjs开发过程中,`xtype`(扩展类型)是极为重要的一个概念。它实际上是一种类型标识符,用于快速创建特定类型的组件实例。通过使用预定义的`xtype`值,开发者可以方便地构建出各种复杂的用户界面而无需编写大量...

    extjs控件列表

    - **描述**: 单选按钮,用于从一组互斥的选项中选择一个。 - **用途**: 性别选择、首选语言等。 **Ext.form.TextArea** - **描述**: 多行文本框,用于输入多行文本。 - **用途**: 意见反馈、留言等。 **Ext.form....

    Ext JS in Action

    - **DataView and ListView (数据视图和列表视图)**:这两种组件提供了更加灵活的方式来展示数据集合,可以根据需求定制不同的样式和布局。 - **Charts (图表)**:Ext JS提供了一系列图表组件,包括柱状图、折线图...

    学习ExtJS Panel常用方法

    - `dataview`: `Ext.DataView` - `datepicker`: `Ext.DatePicker` - `editor`: `Ext.Editor` - `editorgrid`: `Ext.grid.EditorGridPanel` - `flash`: `Ext.FlashComponent` - `grid`: `Ext.grid.GridPanel` ...

    ext designer 设计实例

    EXT JS是一个流行的JavaScript框架,用于构建富客户端Web应用。在这个“EXT Designer 设计实例”中,我们将深入探讨如何利用EXT Designer来构建各种组件,包括Form、Window、Grid、ListView、Panel、DataView以及...

    Ext JS in Action (Final Edition).pdf

    Ext JS是一个强大的JavaScript库,用于构建复杂的Web应用程序。本书涵盖了Ext JS的核心概念和技术,旨在帮助开发者掌握如何使用Ext JS来创建高质量的用户界面。 #### 二、书籍结构与主要内容 本书分为五个主要部分...

    Ext in Action(Ext3.2)

    **Ext JS** 是一个强大的 JavaScript 框架,用于构建复杂的 Web 应用程序。它提供了一套丰富的 UI 组件库,使得开发者能够轻松创建美观且功能强大的用户界面。本章节将详细介绍 Ext JS 的核心特性和基本原理。 - **...

    extjs 项目整理

    通过上述知识点的详细介绍,我们可以看出 ExtJS 是一个非常强大且灵活的前端框架,它不仅提供了丰富的 UI 组件库,还支持复杂的事件处理机制以及数据绑定等功能。对于希望构建高质量、高性能 Web 应用程序的开发者来...

    ExtJS的xtype列表

    ExtJS 是一个强大的JavaScript应用程序框架,它提供了丰富的用户界面组件,用于构建富客户端应用。`xtype` 是ExtJS中的一个重要概念,它是组件类的简写形式,用于在配置对象中声明组件类型,使得代码更加简洁。理解...

    ExtJS in Action-英文原版-完整版

    - 第三部分介绍数据驱动的组件,如网格面板(GridPanel)、编辑器网格面板(EditorGridPanel)、数据视图和列表视图(DataView和ListView)、图表(Charts)、树形结构(trees)以及菜单、按钮和工具栏(Menus, ...

Global site tag (gtag.js) - Google Analytics