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