jjzjj

javascript - ExtJS 和复杂的保存操作

coder 2024-05-17 原文

ExtJS 4.1.0

13 年 6 月 6 日更新 :

我在 Sencha 论坛上发布了同样的问题,那里没有太多的行动。该帖子或多或少相同,但我想我会在这里添加它仅供引用。我仍然渴望听到其他社区成员对 ExtJS 应用程序中必须是非常常见的场景的意见!
http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores

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

Sencha 帖子引起的讨论很少。我决定将大部分复杂保存操作的负载放在我的应用程序服务器上,并在需要的地方延迟刷新客户端存储。通过这种方式,我可以使用我自己的数据库包装器来包含与一个复杂域对象保存相关的所有事务,以保证原子性。如果保存新 Order包括保存订单元数据、OrderContents 的十个新实例。以及潜在的其他信息(位于其他表中的地址、创建订单时定义的新客户等)我更愿意将有效负载发送到应用程序服务器,而不是在客户端应用程序中建立一个粗俗的回调网络代码。以一对一方式关联的数据(例如 Order hasOne Address)在 success 中更新Order.save() 的回调手术。更复杂的数据,如 Order的内容,只需调用 contentStore.sync() 就可以懒惰地处理. 我觉得这是在没有大量客户端回调的情况下保证原子性的方法

原帖内容

考虑到保存关联重模型的整体令人失望的功能,我在我的应用程序中几乎抛弃了模型关联,并依靠自己检索关联数据。这一切都很好,但不幸的是并没有解决实际保存数据和更新 ExtJS 存储以反射(reflect)服务器上的更改的问题。

以保存 Order 为例对象,由元数据和 OrderContents 组成即订单上的零件。元数据以 Order_Data 结尾数据库中的表,而所有内容都以 Order_Contents 结尾表中的每一行都通过 order_id 链接到父订单柱子。

在客户端,检索订单内容非常容易,无需任何关联:var contents = this.getContentsStore().query('order_id', 10).getRange() .然而,一个主要的缺陷是这取决于 OrderContents 中可用的内容记录ExtJS 商店 ,如果我使用的关联不是由数据服务器返回的“main”对象,这将适用。

保存订单时,我发送一个请求,其中包含订单的元数据(例如,日期、订单号、供应商信息等)以及一系列内容。这些数据被挑选出来并保存到相应的表中。这对我来说很有意义并且效果很好。

一切都很好,直到从应用程序服务器返回保存/更新的记录。由于该请求是通过调用 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,但我还没有想出更好的解决方案......

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

最佳答案

13 年 8 月 26 日更新 我发现关联数据确实是由 Ext 在模型代理的创建/更新回调中处理的,但是找到这些数据并不容易...请参阅我的帖子:ExtJS 4.1 - Returning Associated Data in Model.Save() Response

好吧,这个问题已经有几个月了,我觉得这个问题没有神奇的解决方案。

我的解决方法如下...

当保存一个复杂的模型(例如,一个模型有或确实有几个 hasMany 关联)时,我保存包含所有关联数据的“父”模型(作为模型上的属性/字段!),然后添加afterSave/afterUpdate 回调中的(保存的)关联数据。

以我的 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

我有 ModelsPurchaseOrder.Content 建立和 PurchaseOrder.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商店。

  • 我会让这个答案坐一会儿以鼓励讨论。

    谢谢阅读!

    关于javascript - ExtJS 和复杂的保存操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16551901/

    有关javascript - ExtJS 和复杂的保存操作的更多相关文章

    1. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

      我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

    2. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

      我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

    3. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

      我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

    4. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

      在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

    5. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

      我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

    6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

      我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

    7. ruby - 测试一个复杂的方法 - 2

      我正在开发西洋跳棋实现,其中有许多易于测试的方法,但我不确定如何测试我的主要#play_game方法。我的大多数方法都可以很容易地确定输入和输出,因此也很容易测试,但这种方法是多方面的,实际上并没有容易辨别的输出。这是代码:defplay_gameputs@gui.introwhile(game_over?==false)message=nil@gui.render_board(@board)@gui.move_requestplayer_input=getscoordinates=UserInput.translate_move_request_to_coordinates(play

    8. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

      我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

    9. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

      我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

    10. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

      a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

    随机推荐