为什么getUpdatedRecords()不返回Ext JS Property Grid中的修改记录列表?

时间:2013-04-09 21:07:52

标签: extjs extjs4

请尝试this example

打开控制台,运行jsFiddle,更改属性值,然后单击“将状态写入控制台”。

为什么商店仍然报告零更新记录?它知道该物业的新价值。

这是JsFiddle中的Ext JS 4.2代码:

Ext.onReady(function() {    


Ext.define('KitchenSink.view.grid.PropertyGrid', {
    extend: 'Ext.container.Container',

    requires: [
        'Ext.button.Button',
        'Ext.grid.property.*',
        'Ext.layout.container.VBox',
        'Ext.layout.container.HBox'
    ],
    xtype: 'property-grid',


    height: 275,
    width: 300,
    layout: {
        type: 'vbox',
        align: 'stretch'
    },

    initComponent: function(){
        Ext.apply(this, {
            items: [{
                xtype: 'container',
                layout: 'hbox',
                margin: '0 0 10 0',
                defaultType: 'button',
                items: [{
                    text: 'Write state to console',
                    margin: '0 0 0 10',
                    scope: this,
                    handler: this.onWriteStateClick
                }]
            }, {
                xtype: 'propertygrid',
                source: {
                    weight: 0.01,
                    distance: 1
                }
            }]
        });
        this.callParent();
    },

    onWriteStateClick: function(){
        var grid = this.down('propertygrid');

        var store = grid.getStore();
        console.log("Number of new records: " + store.getNewRecords().length);
        console.log("Number of updated records: " + store.getUpdatedRecords().length);
        console.log("Number of deleted records: " + store.getRemovedRecords().length);

        store.each(function (rec) {
            console.log("store says --> key: " + rec.get("name") + ", value: " + rec.get("value"));
        });

        //var source = grid.getSource();
        //Object.keys(source).forEach(function(key) {
        //    console.log("source says --> key: " + key + ", value: " + source[key]);
        //});
    },


});


Ext.create('KitchenSink.view.grid.PropertyGrid', { renderTo: Ext.getBody() });


});

1 个答案:

答案 0 :(得分:2)

简短的回答是property-grid使用了内存代理,它不会跟踪修改后的记录。

长的答案是新的/删除/更新的跟踪仅针对服务器代理实现,或者更具体地,针对持久保存到服务器的字段实现。客户端代理(如内存代理)不需要此代理,因为它永远不会与服务器同步。

对此进行更深入的解释是在此代码中,来自model's set method

if (field && field.persist) {
    if (modified.hasOwnProperty(name)) {
        if (me.isEqual(modified[name], value)) {
            // The original value in me.modified equals the new value, so
            // the field is no longer modified:
            delete modified[name];

            // We might have removed the last modified field, so check to
            // see if there are any modified fields remaining and correct
            // me.dirty:
            me.dirty = false;
            for (key in modified) {
                if (modified.hasOwnProperty(key)){
                    me.dirty = true;
                    break;
                }
            }
        }
    } else {
        me.dirty = true;
        modified[name] = currentValue;
    }
}

你可以看到,如果字段没有持久化(就像它永远不会与客户端代理一样),它就不会得到dirty标志,如果没有它,商店就不会收集记录已更改

即使您要为模型字段定义持久性,同步机制也需要一个id字段。

总而言之 - 您不会使用客户端代理,例如您示例中幕后使用的代理。