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

标签 angularjs tastypie

我们正在使用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/

    相关文章:

    javascript - 读取 $localstorage 的非 AngularJS 方式

    django - tastypie 注册问题

    python - MySQL On Update 未触发 Django/TastyPie REST API

    javascript - 显示所有对象,过滤属性(如果 AngularJS 中存在)

    json - 如何在angularJS中将数据写入文件

    angularjs - 从 nginx 提供 Angular SPA 和另一个 index.html

    ios - 从基本身份验证切换到 Django 和 Tastypie 的 OAuth 2.0

    django - Tastypie APIKey 认证

    javascript - 下载带有授权 header 的 anchor 链接

    javascript - 将 "then"方法添加到 $promise 链中预定义的 "finally"方法之前