【发布时间】:2013-05-09 05:58:23
【问题描述】:
ExtJS 4.1.0
2013 年 6 月 6 日更新:
我在 Sencha 论坛上发布了同样的问题,但没有采取太多行动。该帖子或多或少相同,但我想我会在此处添加它以供参考。我仍然渴望听到其他社区成员对 ExtJS 应用程序中非常常见的场景的意见! http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
2013 年 7 月 16 日更新(结论?)
煎茶帖子引起的讨论很少。我决定将大部分复杂保存操作的负载放在我的应用程序服务器上,并在需要的地方懒惰地刷新客户端存储。这样我可以使用我自己的数据库包装器来包含与一个复杂的域对象相关的所有事务保存以保证原子性。如果保存新的Order 包括保存订单元数据、十个OrderContents 的新实例以及可能的其他信息(位于其他表中的地址、在创建订单时定义的新客户等),我更愿意将有效负载发送到应用程序服务器,而不是在客户端应用程序代码中建立一个粗俗的回调网络。一对一关联的数据(例如Order hasOne Address)在Order.save() 操作的success 回调中更新。更复杂的数据,例如Order 的内容,只需调用contentStore.sync() 就可以懒惰地处理。 我觉得这是在没有大量客户端回调的情况下保证原子性的方法
原帖内容
鉴于保存关联繁重的模型的整体功能令人失望,我几乎放弃了我的应用程序中的模型关联,并依靠自己检索关联的数据。这一切都很好,但不幸的是并没有解决实际保存数据和更新 ExtJS 存储以反映服务器上的更改的问题。
以保存Order 对象为例,该对象由元数据以及OrderContents 即订单上的部分组成。元数据最终位于数据库中的 Order_Data 表中,而内容全部位于 Order_Contents 表中,其中每一行通过 order_id 列链接到父订单。
在客户端,检索订单内容非常容易,无需任何关联:var contents = this.getContentsStore().query('order_id', 10).getRange()。然而,一个主要缺陷是 这取决于 OrderContents ExtJS 商店中可用的内容记录,如果我使用的关联不是由数据服务器返回的“主”对象。
保存订单时,我发送一个请求,其中包含订单的元数据(例如日期、订单号、供应商信息等)以及一系列内容。这些数据被挑选出来并保存到相应的表中。这对我来说很有意义并且效果很好。
一切都很好,直到从应用程序服务器返回已保存/更新的记录。由于请求是通过调用OrderObject.save() 触发的,因此没有任何信息告诉OrderContents 存储有新记录可用。如果我改为将记录添加到存储并调用.sync(),这将自动处理,但我觉得这会使保存过程复杂化,我宁愿在应用程序服务器上处理这种解耦,更不用说保存整个请求也很不错。
有没有更好的方法来解决这个问题?我目前的解决方案如下...
var orderContentsStore = this.getOrderContentsStore();
MyOrderObject.save({
success: function(rec, op){
// New Content Records need to be added to the contents store!
orderContentsStore.add(rec.get('contents')); // Array of OrderContent Records
orderContentsStore.commitChanges(); // This is very important
}
});
通过调用commitChanges(),添加到存储中的记录被认为是干净的(非幻像,非脏),因此不再由存储的getModifiedRecords() 方法返回;正确,因为在发生store.sync() 的情况下不应将记录传递给应用程序服务器。
这种方法对我来说似乎有点草率/hacky,但我还没有找到更好的解决方案......
非常感谢任何输入/想法!
【问题讨论】:
-
不幸的是,这是唯一的方法。或者,您可以在商店的代理上编写自己的“作家”并在那里处理不同的模型,但这也会很麻烦。
-
感谢您确认我的信念,@Mike。有一天我会写一篇博文,我会用所说的帖子中的信息来回答这个问题。我确实考虑过对 Data Writer 实现一些疯狂的扩展,但对于它会完成的事情(在这里和那里保存 store.load()),我觉得实现所需的额外复杂性和时间不值得我花时间。跨度>
标签: javascript model-view-controller extjs orm extjs4