仅将更改的属性发送到Breeze的SaveChanges()方法

时间:2014-03-05 08:16:25

标签: javascript breeze

在Breezejs中保存更改时,因为我有多个字段的实体,我想发送到服务器(到Breeze SaveChanges()方法)而不是整个实体,而是只发送实体的一个子集,包含只是已经改变的属性。我知道这就是实体内部的OriginalValuesMap属性所在,它只是为了减少网络流量以提高性能(尽管它可能是一个非常小的改进)。在官方Breezejs' website我找不到任何关于此事的信息,也没有在互联网上找到任何信息。感谢名单

2 个答案:

答案 0 :(得分:3)

由于不同的原因,我们遇到了类似的要求。我们的应用程序的一部分与第三方API接口,该第三方API坚持使用put进行增量(无论出于何种原因,放置完整实体都会导致服务器错误或严重的性能问题)。

我们最终推出了一个新的数据服务适配器来解决这个问题,这是一个相对无痛的过程。我们直接从基础AbstractDataServiceAdapter扩展,但您可以在您碰巧使用的任何具体数据服务适配器之上使用自定义_prepareSaveBundle。

您只需注册自定义适配器:

ctor = ->
  @name = 'custom_ds'
ctor.prototype = new breeze.AbstractDataServiceAdapter() # or whatever your base is
ctor.prototype._prepareSaveBundle = (saveContext, saveBundle) ->
  # Do whatever your base implementation does, but use helper.unwrapChangedValues
  # instead of helper.unwrapInstance to get at the delta
breeze.config.registerAdapter 'dataService', ctor

然后将您的实体管理器绑定到使用它的数据服务:

breeze.config.initializeAdapterInstance 'dataService', 'custom_ds'
ds = new breeze.DataService
  adapterName: 'custom_ds'
  # plus whatever other properties you need to init
manager = new breeze.EntityManager
  dataService: ds
  # plus whatever other properties you need to init

但如果你只是为了缩减你的有效载荷,那么由于Jay Traband所说的所有原因,这可能不值得麻烦和增加脆弱性。

答案 1 :(得分:1)

我们故意决定不这样做,因为我们觉得性能提升不值得额外的复杂性。我们基于几个考虑做出了这个决定。

  • 它只对修改和删除有用,添加仍然需要携带每个字段。
  • 在大多数应用程序中,保存有效负载往往比查询负载小得多。
  • 标准HTTP压缩使这些有效载荷中的最大有效载荷小得多。

我们多年来一直在各种技术中构建RIA应用程序,根据我们的经验,优化保存有效负载很少会提高整体应用程序性能。

但是......请随意将此请求添加到Breeze用户语音。与其他人一样,如果我们的用户认为这很重要,那么我们就会这样做。