Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有用户定义id的ExtJs4模型_Extjs_Extjs4_Extjs4.1 - Fatal编程技术网

具有用户定义id的ExtJs4模型

具有用户定义id的ExtJs4模型,extjs,extjs4,extjs4.1,Extjs,Extjs4,Extjs4.1,我有以下型号: Ext.define('Gst.model.Order', { extend: 'Ext.data.Model', idProperty: 'id', fields: [ { name: 'id', type: 'string' } ] }); 我的问题是订单模型的ID是用户定义的。因此,创建新订单实例并将其插入订单存储的代码如下: order = Ext.create('Gst.model.Order', {'id'

我有以下型号:

Ext.define('Gst.model.Order', {
    extend: 'Ext.data.Model',
    idProperty: 'id',
    fields: [
        { name: 'id', type: 'string' } 
    ]
});     
我的问题是订单模型的ID是用户定义的。因此,创建新订单实例并将其插入订单存储的代码如下:

order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedvalue'}); 
store.insert(0, order);
发生的情况是,由于idProperty由用户提供,因此订单未标记为幻影,因此不被视为脏订单。因此,不会向服务器发送POST。如果我手动将订单设置为phantom and dirty,那么我可以在将订单插入存储时触发POST,如:

order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedID'});
order.phantom = true;
order.setDirty(); 
store.insert(0, order);
这很好,但是我的服务器端代码使用REST控制器,并且希望帖子在url中没有和id。因此,虽然请求extJS的问题是

POST http://app.local/api/order/someuserdefinedID.json
而我的服务器将寻找的格式是

POST http://app.local/api/order.json
因此,我唯一能解决这个问题的方法就是创建一个订单,设置phantom=true并调用setDirty()。这将导致发布POST,然后在我的RestProxy中使用逻辑覆盖buildUrl:来测试POST请求并从url中删除idProperty

这对我来说似乎是一个丑陋的工作,我想知道是否有更好的方法


我想我的问题是:处理这样的事情的最佳方法是什么?

一个可能的解决方案是在模型中添加一个
order\u id
属性,并将
id
保留为自然键吗?在我看来,与框架想要处理
idProperty
的方式作斗争需要做大量的工作。就我的2c。

正如John Hall所说,您应该使用另一个
idproperty
或重命名您的id,以便框架使用隐式id(内部id)


然后,脏/幻影将起作用,发布将在数据中包含用户id,但不作为记录的键。

您应该提供您正在使用的确切ExtJS版本在客户端为新记录设置id是不寻常的。这通常是数据库的工作。Dmitry:我曾想过使用db控制的pk,但它更有意义,但我愿意接受建议。上述模型将用于跟踪销售代表下订单时的佣金的系统。由于实际的订单系统是关闭的,我认为使用其已经唯一的orderId作为pk最有意义。您必须使用代理int id。一些ui组件(即网格面板和树面板)需要一个整数id字段进行选择和其他内部内容。我同意John的观点。虽然我是数据仓库专家,但我将为他的建议提出不同的术语。您应该有一个名为id的代理键(唯一键),并在记录创建期间将其保留为空,以避免框架中的API函数调用攻击。然后添加另一个属性作为自然键,称为order\u id。在创建记录期间设置order\u id,并将id作为数据库中的标识id,因此它每次递增一个,不需要用户设置。任何应用程序的经验法则是,最终用户永远不应该看到内部(唯一)id。