这是我的模特:
Ext.define('A.model.Group', {
extend: 'Ext.data.Model',
fields:['id', 'name'],
proxy: {
type: 'rest',
url: '/group',
reader: {
type: 'json',
root: 'data'
},
writer: {
type: 'json',
writeAllFields: false
}
}
});
该模型正在通过TreeStore在树中使用
问题在于,当PUT
,POST
或DELETE
方法完成后,Ext.data.NodeInterface
中的字段不会仅从JSON有效内容中的模型中发送字段也发送。这是一个示例有效载荷:
{"id":"","name":"TestGroup","parentId":"8","index":0,"depth":3,"checked":null}
我不希望发送额外字段parentId
,index
,depth
和checked
。做这个的最好方式是什么?我不想在服务器上忽略它们。
答案 0 :(得分:5)
如果您不想仅向服务器发送特定数据,则writeAllFields不是解决方案,因为它设置为false,它只发送修改后的字段。
您的问题的解决方案是定义您自己的编写器并覆盖方法getRecordData
这是一个可行的示例:
var newWriter = Ext.create('Ext.data.writer.Json',{
getRecordData: function(record){
return {'id':record.data.id,'name':record.data.name};
}
})
Ext.define('A.model.Group', {
extend: 'Ext.data.Model',
fields:['id', 'name'],
proxy: {
type: 'rest',
url: '/group',
reader: {
type: 'json',
root: 'data'
},
writer: newWriter
}
});
答案 1 :(得分:4)
NodeInterface
将这些字段添加到您的模型中:
{name: 'parentId', type: idType, defaultValue: null},
{name: 'index', type: 'int', defaultValue: null, persist: false},
{name: 'depth', type: 'int', defaultValue: 0, persist: false},
{name: 'expanded', type: 'bool', defaultValue: false, persist: false},
{name: 'expandable', type: 'bool', defaultValue: true, persist: false},
{name: 'checked', type: 'auto', defaultValue: null, persist: false},
{name: 'leaf', type: 'bool', defaultValue: false},
{name: 'cls', type: 'string', defaultValue: null, persist: false},
{name: 'iconCls', type: 'string', defaultValue: null, persist: false},
{name: 'icon', type: 'string', defaultValue: null, persist: false},
{name: 'root', type: 'boolean', defaultValue: false, persist: false},
{name: 'isLast', type: 'boolean', defaultValue: false, persist: false},
{name: 'isFirst', type: 'boolean', defaultValue: false, persist: false},
{name: 'allowDrop', type: 'boolean', defaultValue: true, persist: false},
{name: 'allowDrag', type: 'boolean', defaultValue: true, persist: false},
{name: 'loaded', type: 'boolean', defaultValue: false, persist: false},
{name: 'loading', type: 'boolean', defaultValue: false, persist: false},
{name: 'href', type: 'string', defaultValue: null, persist: false},
{name: 'hrefTarget', type: 'string', defaultValue: null, persist: false},
{name: 'qtip', type: 'string', defaultValue: null, persist: false},
{name: 'qtitle', type: 'string', defaultValue: null, persist: false},
{name: 'children', type: 'auto', defaultValue: null, persist: false}
他们中的两个人没有“坚持不懈”。属性。
大多数NodeInterface的字段默认为persist:false。这意味着默认情况下它们是非持久字段。在调用TreeStore的同步方法或在模型上调用save()时,不会通过代理保存非持久字段。在大多数情况下,大多数这些字段可以保留其默认持久性设置,但有时需要覆盖某些字段的持久性。以下示例演示如何覆盖NodeInterface字段的持久性。覆盖NodeInterface字段时,仅更改persist属性非常重要。永远不应更改name,type和defaultValue 覆盖这样的字段:
{ name: 'iconCls', type: 'string', defaultValue: null, persist: true },
答案 2 :(得分:2)
您可以将序列化程序添加到模型中您不想发送到服务器的字段中。
var makeUndefined = function(value, record) {
return undefined;
}
var fieldsOfYourModel = [
{
serialize: makeUndefined,
name: 'parentId'
},
{
serialize: makeUndefined,
name: 'index'
}
];
serialize
是一个函数,它将此Field的Model值转换为一种形式,可供任何Writer用于与服务器同步数据。 http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Field-cfg-serialize
serialize
可用。