ExtJS的和复杂的保存操作(ExtJS and Complex Save Operations)

2019-09-03 05:23发布

ExtJS的4.1.0

更新13年6月6日

我已经张贴在煎茶论坛,那里一直没有太大的动作同样的问题。 后或多或少是相同的,但我想我会添加在这里仅供参考。 我仍然渴望听到其他社区成员的什么必须是一个ExtJS的应用非常常见的场景输入! http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores

更新13年7月16日(结论?)

在煎茶后获取了很小的讨论。 我已经决定把大部分复杂的负载保存操作的我的应用程序服务器上,懒洋洋地刷新客户端卖场里需要的话。 这样我可以用我自己的数据库的包装,以涵盖所有用一个复杂的域对象关联交易的保存,以保证原子。 如果在保存新Order包括保存订单的元数据,十大新实例OrderContents和潜在的其他信息(居住在其他表的地址,一个新的客户在订单创建,等的时间定义)我宁愿发送有效载荷应用服务器上,而不是建立在客户端应用程序代码回调的低俗网站。 其上的一对一的基础相关联的(例如,数据Order hasOne Address )在被更新success的回调Order.save()操作。 更复杂的数据,如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()

这种做法似乎只是有点儿马虎/哈克给我,但我还没有想出更好的解决方案?

任何输入/想法是非常感谢!

Answer 1:

更新13年8月26日我发现,相关的数据是通过在内线对模型的代理创建/更新回调确实处理,但发现数据是不容易的......看我的帖子在这里: ExtJS的4.1 -在返回相关数据Model.Save()响应

嗯,这是一直有这个问题开了几个月,我觉得没有神奇真棒解决这个问题。

我的解决方案如下......

当保存一个复杂的模型(例如,一个模型会,还是有几个hasMany关联),我保存了“父”的模型,其中包括所有相关的数据(如模型上的属性/字段!),然后加入(保存)在afterSave /更新后的回调相关联的数据。

就拿我PurchaseOrder哪个型号hasMany ItemshasOne Address 。 注意到,相关的数据包含在模型中的属性,因为它不会被传递到服务器,如果它只是在模型的联想专卖店的存在。

console.log(PurchaseOrder.getData());
---
id: 0
order_num: "PO12345"
order_total: 100.95
customer_id: 1
order_address: Object
    id: 0
    ship_address_1: "123 Awesome Street"
    ship_address_2: "Suite B"
    ship_city: "Gnarlyville"
    ship_state: "Vermont"
    ship_zip: "05401"
    ...etc...
contents: Array[2]
    0: Object
        id: 0
        sku: "BR10831"
        name: "Super Cool Shiny Thing"
        quantity: 5
        sold_price: 84.23
    1: Object
        id: 0
        sku: "BR10311"
        name: "Moderately Fun Paddle Ball"
        quantity: 1
        sold_price: 1.39

我有Models的建立PurchaseOrder.ContentPurchaseOrder.Address ,但在数据PurchaseOrder没有这些模型,而不仅仅是数据的一个实例。 再次,这是为了确保其正确地传递给应用服务器。

一旦我有像上述目的,我通过把它送上我的应用服务器.save()如下:

PurchaseOrder.save({
    scope: me,
    success: me.afterOrderSave,
    failure: function(rec,op){
        console.error('Error saving Purchase Order', op);
    }
});

afterOrderSave: function(record, operation){
    var me = this;
    switch(operation.action){
        case 'create':
            /** 
              * Add the records to the appropriate stores.
              * Since these records (from the server) have an id,
              * they will not be marked as dirty nor as phantoms 
              */
            var savedRecord = operation.getResultSet().records[0];  // has associated!
            me.getOrderStore().add(savedRecord);
            me.getOrderContentStore().add(savedRecord.getContents()); //association!
            me.getOrderAddressStore().add(savedRecord.getAddress()); // association!
            break;

        case 'update':
            // Locate and update records with response from server
            break;
    }
}

我的应用程序服务器接收到PurchaseOrder并处理相应的保存数据。 我不会去毛细节这个过程在很大程度上取决于你自己的实现。 我的应用程序框架是松散的基础上Zend的1.11(主要是利用Zend_Db )。

我觉得这是由于以下原因,最好的方法:

  • 各种model.save()回调的客户端上没有凌乱的字符串
  • 只有一个要求,这是非常容易管理
  • 原子性是很容易在应用服务器上处理
  • 少往返=失败担心的可能性就越小点
  • 如果你真的感觉懒惰,则success回调的方法,可以简单地reload门店。

我会让这个答案坐了一下,鼓励讨论。

谢谢阅读!



文章来源: ExtJS and Complex Save Operations