2012-09-19 60 views
7

我有以下型号:ExtJs4模型用户定义的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。如果我手动设置为幻影和肮脏的话,我可以触发POST当我插入的顺序到像店:

order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedID'}); 
order.phantom = true; 
order.setDirty(); 
store.insert(0, order); 

这将是罚款,但我的服务器端代码使用REST控制器,并期待着POST不要在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。

这看起来像是一个丑陋的工作,想知道是否有更好的方法?

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

+0

您应该提供您正在使用的确切ExtJS版本 – sra

+1

在客户端为新记录设置ID是很常见的。这通常是数据库的工作。 – dbrin

+0

Sra:我正在使用ExtJs 4.1.1 – John

回答

1

将可能的解决方案是将order_id属性添加到模型并将id作为自然键吗?在我看来,像对抗idProperty的方式一样,需要做很多工作。只是我的2c。

+0

我同意约翰。虽然我是数据仓库专家,但我会为他的建议提出不同的条款。您应该有一个名为id的代理键(唯一键),并在创建记录时将其保留为空,以避免API框架调用hack。然后添加另一个属性,作为自然键,称为order_id。在创建记录期间设置order_id,并将id作为数据库中的身份标识,因此每次增加一个,并且不需要由用户设置。任何应用程序的经验法则是最终用户不应该看到内部(唯一)标识。 – MacGyver

0

就像约翰·霍尔说的,你应该使用另一个idproperty或者重命名你的id,这样框架(内部id)会使用一个隐含的id。

脏/幻影然后将工作和发布将包括数据中的用户ID,但不是记录的关键。