我正在尝试针对Restful RubyonRails后端创建一个简单的ExtJS5应用程序。出于某种原因,当我实例化模型时,ExtJs使用模型(和计数器)的名称填充“idProperty”字段。 e.g。
{ “Traffic_id”: “MyApp.model.Person-1”, “EXTERNAL_ID”:0,...
我认为“idProperty”字段本质上是数据记录的主键,通常在将记录插入DB(自动增量)时设置
因此该字段应为null或类似,因为模型尚未添加到商店并同步到后端。
更令人惊讶的是,该字段定义为'int',ExtJS将字符串放入其中!
有人可以告诉我发生了什么事吗?
彼得
下面是一个app.js:小提琴:
Ext.application({
name : 'Fiddle',
launch : function() {
var model = Ext.create('MyApp.model.Person');
Ext.Msg.alert('Fiddle', JSON.stringify(model.data));
}
});
Ext.define('MyApp.model.Person', {
extend: 'Ext.data.Model',
idProperty: 'Traffic_id',
proxy: {
type: 'rest',
// url: '/traffics.json',
format: 'json',
api: {
create: 'traffics',
read: 'traffics',
update: 'traffics/edit',
destroy: 'traffics'
},
reader: {
type: 'json',
rootProperty: 'traffic',
successProperty: 'success',
messageProperty: 'message'
},
writer: {
type: 'json',
//writeAllFields : false,
//encode: true,
rootProperty: 'traffic'
},
afterRequest: function(req, res) {
console.log("Ahoy!", req.operation.response);
},
listeners: {
exception: function(proxy, response, operation) {
//debugger;
Ext.MessageBox.show({
title: 'XXX REMOTE EXCEPTION',
msg: operation.getError(),
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
}
},
fields: [{
name: 'Traffic_id',
type: 'int'
}, {
name: 'external_id',
type: 'int'
}, {
name: 'description',
type: 'string'
}, {
name: 'insertUser',
type: 'string'
}, {
name: 'insertDate',
type: 'date'
}]
});
答案 0 :(得分:2)
设置配置选项:persist: false
。创建它时不会将值发送到服务器。当字段用于在客户端上保持状态但不需要持久保存到服务器时,此选项很有用。Ext.data.field.Field.persist
Ext.define('MyApp.model.Person', {
extend: 'Ext.data.Model',
idProperty: 'Traffic_id',
fields: [{
name: 'Traffic_id',
type: 'int',
persist: false
}, {
name: 'external_id',
type: 'int'
}, {
name: 'description',
type: 'string'
}, {
name: 'insertUser',
type: 'string'
}, {
name: 'insertDate',
type: 'date'
}]
});
答案 1 :(得分:0)
ExtJS为新创建的模型分配“临时”ID;它可以区分已创建客户端尚未保存的模型(“幻像”模型)与已下载的模型。因此,它知道何时调用create
vs update
,它会(我认为,从内存中)在上传到create
REST端点时删除ID。
它需要ID,因为新创建的模型可以进入商店(例如,对于会话,如果没有别的话)。
您看到的ID样式来自默认的sequential
生成器。
有关详情,请参阅http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.data.identifier.Generator。
答案 2 :(得分:0)
使用calculate函数添加另一个字段,并将false保持为模型。在View中使用此字段而不是idProperty:
Ext.define('MyApp.model.MyModel', {
extend: 'Ext.data.Model',
requires: [
'Ext.data.field.Integer',
'Ext.data.field.String'
],
idProperty: 'myId',
fields: [
{
type: 'int',
mapping: 'myId',
name: 'myId'
},
{
type: 'string',
mapping: 'myName',
name: 'myName'
},
{
calculate: function(data) {
if(!data) {
return '';
}
else {
return data.myId;
}
},
name: 'myViewId',
persist: false
}
]
});
答案 3 :(得分:0)
我做了一个解决方法。创建模型实例后,将id属性设置为null。
var instance = Ext.create('MyModel');
instance.set('idProperty', null);
答案 4 :(得分:0)
您有可能需要坚持该选择。如果要自定义ID,还有另一种选择。使用标识符。我的操作方式:在模型中添加以下代码。
identifier: {
type: 'sequential',
seed: 3
},