具有用户定义id的ExtJs4模型

时间:2012-09-19 04:05:53

标签: 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': '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。

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

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

2 个答案:

答案 0 :(得分:1)

可能的解决方案是将order_id属性添加到模型中并将id保留为自然键吗?在我看来,对于反对框架想要处理idProperty的方式来说,这是一项非常艰巨的工作。只是我的2c。

答案 1 :(得分:0)

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

脏/幻像随后会起作用,发布会在数据中包含用户ID,但不包括记录的密钥。