加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 使用基于$资源的服务的部分更新(也称为PATCH)?

发布时间:2020-12-17 09:41:41 所属栏目:安全 来源:网络整理
导读:我们正在使用Django / TastyPie作为后端REST服务提供商构建一个Web应用程序,并构建一个基于AngularJS的前端,对服务器上的CRUD对象使用了大量基于$资源的服务.一切工作到目前为止! 但是,当我们要仅更新对象上一个或两个更改的字段时,我们希望减少我们发货的
我们正在使用Django / TastyPie作为后端REST服务提供商构建一个Web应用程序,并构建一个基于AngularJS的前端,对服务器上的CRUD对象使用了大量基于$资源的服务.一切工作到目前为止!

但是,当我们要仅更新对象上一个或两个更改的字段时,我们希望减少我们发货的数据量.

TastyPie使用HTTP PATCH方法支持此功能.我们在对象上定义了一个.diff()方法,所以我们可以确定在进行更新时我们想要发送哪些字段.我找不到任何关于如何定义/实现$资源返回的实例对象上的方法来做任何文档.

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

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

到目前为止,我找不到任何文档(或其他SO文章)描述如何做到这一点,但真的很感谢任何人可能有任何建议.

谢谢.

我们实现了$patchusing ngResource,但它有一点涉及(我们在服务器端使用Django Rest Framework).对于您的差异组件,我将离开您自己的实现.我们使用一个原始的缓存来跟踪资源的变化,所以我可以轮询一个给定的对象,看看什么(如果有的话)已经改变了.

我利用下划线的_.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...)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读