请尝试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() });
});
答案 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字段。
总而言之 - 您不会使用客户端代理,例如您示例中幕后使用的代理。