我们正在使用Django/TastyPie作为后端REST服务提供程序来构建Web应用程序,并使用大量基于$ resource的服务对服务器上的CRUD对象进行构建,从而构建基于AngularJS的前端。到目前为止一切正常!
但是,当我们只想更新对象上的一个或两个更改的字段时,我们希望减少所传送的数据量。
TastyPie使用HTTP PATCH方法支持此功能。我们在对象上定义了.diff()方法,因此我们可以确定在进行更新时要发送的字段。我只是找不到关于如何在$ resource返回的实例对象上定义/实现方法以完成我们想要的任何文档。
我们要做的是向对象实例(as described in the Angular.js documentation here)添加另一个方法,例如myobject。$ partialupdate(),该方法将:
到目前为止,我找不到任何描述该操作方法的文档(或其他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...)