在ExtJS商店中使用后数据之间的差异是什么

时间:2014-05-01 20:53:43

标签: javascript extjs4

每次(弹出)窗口中的网格呈现时,我都会使用底部的函数(重新)创建商店。但是我不明白为什么typeDetails与使用Ext.pluck(基于https://stackoverflow.com/a/5709096/34806)记录在较长行上的内容不同。

以前的控制台日志始终打印出我期望的内容,默认情况下为[{"label":"","value":""}],或者预先填充typeDetails,例如:

[{"label":"foo","value":"bar"},{"label":"what","value":"ever"}]

但是后一个console.log总是表示一个空数组,而且我总是得到一个空网格。采摘的线路有问题吗?这个答案,尽管不是被接受的或得分最高的,已经超过了20个。我还能做些什么才能解决这个问题。

listeners: {
    render: {
        fn: function (grid) {
            var typeDetails = this.typeDetails || [{ 'label': '', 'value': ''}];

            var store = Ext.create('Ext.data.Store', {
                fields: ['label', 'value'],
                data: [typeDetails]
            });

            console.log(Ext.encode(typeDetails));
            console.log(Ext.encode(Ext.pluck(grid.store.data.items, 'data')));

            grid.reconfigure(store);
        }
    }
}

UPDATE / OUTPUT

回应Evan的评论“如果它默认数据,下面的商店数据将是[[{label: '', value: ''}]]”是从我的控制台直接复制/粘贴的内容:

[{"label":"","value":""}]
[] 

但我认为这是因为 grid.reconfigure之前的日志记录是。尽管如此,我的控制台/日志记录如下:

grid.reconfigure(store);

console.log(Ext.encode(this.typeDetails));
console.log(Ext.encode(typeDetails));
console.log(Ext.encode(Ext.pluck(grid.store.data.items, 'data')));

在非默认情况下(当this.typeDetails 预先填充时)导致以下神秘输出:

[{"label":"foo","value":"bar"},{"label":"what","value":"ever"}] 
[{"label":"foo","value":"bar"},{"label":"what","value":"ever"}]
[{"label":"","value":""}]

这是一个可编辑的网格,非默认值只能存在于默认的空行之后,因此就好像保留了空行一样。

1 个答案:

答案 0 :(得分:0)

以下替代方法有效:

listeners: {
    render: {
        fn: function (grid) {
            var store = Ext.create('Ext.data.Store', {
                fields: ['label', 'value'],
                data: []
            });

            if (this.typeDetails) {
                for (var i = 0, n = this.typeDetails.length; i < n; i++) {
                    store.add(this.typeDetails[i]);
                }
            }
            else {
                store.add({ 'label': '', 'value': '' });
            }

            grid.reconfigure(store);
        }
    }
}