1

请试试这个例子

打开控制台,运行 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() });


});
4

1 回答 1

2

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

长答案是新的/删除的/更新的跟踪仅针对服务器代理实现,或者更具体地说,针对持久化到服务器的字段。客户端代理,如内存代理,不需要这个,因为它从不同步到服务器。

对此的更深入的解释是在这段代码中,来自模型的set方法

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 字段。

总而言之 - 您无法通过客户端代理获得这一点,例如您的示例中在幕后使用的代理。

于 2013-04-09T22:54:43.870 回答