gpt4 book ai didi

angularjs - 使用基于$ resource的服务进行部分更新(aka PATCH)?

转载 作者:行者123 更新时间:2023-12-04 03:01:10 25 4
gpt4 key购买 nike

我们正在使用Django/TastyPie作为后端REST服务提供程序来构建Web应用程序,并使用大量基于$ resource的服务对服务器上的CRUD对象进行构建,从而构建基于AngularJS的前端。到目前为止一切正常!

但是,当我们只想更新对象上的一个或两个更改的字段时,我们希望减少所传送的数据量。

TastyPie使用HTTP PATCH方法支持此功能。我们在对象上定义了.diff()方法,因此我们可以确定在进行更新时要发送的字段。我只是找不到关于如何在$ resource返回的实例对象上定义/实现方法以完成我们想要的任何文档。

我们要做的是向对象实例(as described in the Angular.js documentation here)添加另一个方法,例如myobject。$ partialupdate(),该方法将:

  • 调用我们的.diff()函数来确定要发送的字段,然后
  • 使用HTTP PATCH请求仅将那些字段发送到服务器。

  • 到目前为止,我找不到任何描述该操作方法的文档(或其他SO帖子),但非常感谢任何人可能提出的任何建议。

    谢谢你。

    最佳答案

    我们使用ngResource实现了$patch,但涉及到一点(我们在服务器端使用了Django Rest Framework)。对于您的diff组件,我将留给您自己实现。我们使用原始缓存来跟踪资源的更改,因此我可以轮询给定的对象并查看发生了什么更改(如果有)。

    我利用下划线的_.pick()方法提取已知字段以保存现有实例,创建副本(以及已知的主键)并使用$patch保存该副本。

    我们还使用一些实用程序类来扩展内置资源。

    app.factory 'PartUpdateMixin', ['$q', '_', ($q, _) ->

    PartUpdateMixin = (klass) ->
    partial_update: (keys...) ->
    deferred = $q.defer()
    params = _.pick(@, 'id', keys...)
    o = new klass(params)
    o.$patch(deferred.resolve, deferred.reject)
    return deferred.promise
    ]

    这是用于增强资源的实用程序类。
    app.factory 'extend', ->
    extend = (obj, mixins...) ->
    for mixin in mixins
    obj[name] = method for name, method of mixin
    obj

    app.factory 'include', ['extend', (extend) ->
    include = (klass, mixins...) ->
    extend klass.prototype, mixins...

    return include
    ]

    最后,我们可以增强我们的资源
    include TheResource, PartUpdateMixin(TheResource)
    resourceInstance = TheResource.get(id: 1234)
    # Later...
    updatedFields = getChangedFields(resourceInstance)
    resourceInstance.partial_update(updatedFields...)

    关于angularjs - 使用基于$ resource的服务进行部分更新(aka PATCH)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19258334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com