Extjs继承奇怪的行为

时间:2013-12-16 13:46:56

标签: inheritance extjs

我在Extjs中有继承,我希望子类属性与父类属性(在本例中为列)合并。

Ext.define('MyApp.view.Child', {
    extend: 'MyApp.view.Parent',
    title: 'Action Column Child extend ',
    alias: 'widget.childpanel',
    initComponent: function () {
        //this merging very odd.        
        this.columns = Ext.apply(this.columns, [{
            text: 'Other',
            dataIndex: 'other'
        }]);
        this.callParent(arguments)
    }
});

http://jsfiddle.net/PM6j6/

两个问题:
1)我正在尝试将子列属性与父项合并,并且合并部分工作,它添加了Other列,但从父项中删除了第一个。请参阅jsfiddle进行模拟。

2)当我渲染网格及其父级并点击排序时,两个网格都会被排序。它就像一次碰撞。

由于

2 个答案:

答案 0 :(得分:1)

  1. 我认为您需要clone父列,并在这种情况下使用push

    initComponent: function () {
        var clonedParentColumns = Ext.clone(this.superclass.columns);
    
        clonedParentColumns.push({
            text: 'Other',
            dataIndex: 'other'
        });
    
        this.columns = clonedParentColumns;
    
        this.callParent(arguments);
    }
    

    http://jsfiddle.net/jUE8j/

  2. 父母和孩子都使用相同的store。 (在此示例中,为每个商店创建商店:http://jsfiddle.net/jUE8j/2/

答案 1 :(得分:1)

Ext.apply用于将一个对象属性合并到另一个对象。然而,网格的column config是列配置对象的数组

因此,您只需将附加列配置对象推送到数组:

initComponent: function() {
    this.columns.push({
        text: 'Other',
        dataIndex: 'other'
    });

    this.callParent(arguments);
}

至于你的第二个问题,已经提到如果你不想在两个网格上应用分类器和过滤器,你需要使用不同的商店。