ExtJs4模型与用户定义的ID

7

我有以下模型:

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

虽然我的服务器寻找的格式是 <\p>。
POST http://app.local/api/order.json

所以我想到的解决方法就是创建一个订单,然后将phantom设置为true并调用setDirty()。这将导致POST请求被发送,然后在我的RestProxy覆盖buildUrl:方法中编写逻辑来测试POST请求并从URL中删除idProperty。

对我来说,这似乎只是一个丑陋的变通方法,我想知道是否有更好的方法?

我的问题是:如何处理这种情况最好的方式是什么?


你应该提供你正在使用的确切的ExtJS版本。 - sra
1
在客户端为新记录设置ID是不寻常的。这通常是数据库的工作。 - dbrin
Dmitry:我曾考虑过使用数据库控制的主键,但这样做似乎不太合理,如果有更好的建议我也很乐意听取。上述模型将用于跟踪销售代表在他们下订单时的佣金。由于实际订单系统是封闭的,我认为使用它已经具有的唯一orderId作为主键是最合理的选择。 - John
1
你必须使用代理 int id。一些 UI 组件(例如网格面板和树形面板)期望选择和其他内部操作的整数 id 字段。 - Diego L Espiñeira
2个回答

1

可能的解决方案是将order_id属性添加到模型中,并将id保留为自然键?对我来说,与其反抗框架想要处理idProperty的方式,还不如多做一些工作。这只是我的个人意见。


我同意John的观点。虽然我是数据仓库专家,但我会为他的建议提出不同的术语。您应该有一个称为id的代理键(唯一键),并在记录创建期间将其保留为空,以避免使用框架进行API函数调用黑客攻击。然后添加另一个属性作为自然键,称为order_id。在记录创建期间设置order_id,并将id作为数据库中的标识符,因此每次递增1,无需由用户设置。任何应用程序的经验法则是最终用户不应看到内部(唯一)id。 - Entree

0

就像John Hall所说的那样,您应该使用另一个idproperty或者重命名您的id,以便框架使用隐式id(内部id)。

这样,dirty/phantom就可以工作了,并且发布将包括用户ID在数据中,但不作为记录的键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接