当前位置: 首页 > 面试题库 >

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

皇甫才良
2023-03-14
问题内容

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

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

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

我们想要做的是向对象实例添加另一个方法(如Angular.js文档中所述),例如
myobject。$ partialupdate() ,它将:

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

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

谢谢。


问题答案:

我们$patch使用ngResource 实现,但涉及到一点点(我们在服务器端使用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...)


 类似资料:
  • 问题内容: 我试图显示一个包含大量元素的表。我想对表进行分页并仅加载当前页面上显示的元素。现在,json加载了。 我在这里读到,最好在json标头中传递分页信息(currentPage,pagesCount和elementsCount)。 我如何从angular访问json头中的那些信息? 这是基本的js结构: 问题答案: 根据AngularJS $ resource文档,应该可以这样做:

  • 我想使用最新的融合位置提供商客户端在“后台服务”上获取位置更新。我不想使用所有人都在使用的位置侦听器和Google API客户端。我还需要使用google play服务提供的位置设置Api来检查该“后台服务”上的位置设置是禁用还是启用。请帮忙。

  • 需要更新时钟小部件的TextView每秒或每分钟变化。 我正在从AppWidgetProvider的onReceive调用服务: 我应该做什么来检查更新的时间,如果有,然后更新‘时间’文本视图… 任何一种都是非常非常非常感谢的

  • 在RoomDatabase中创建数据库时,一切工作都很好,并且数据已成功加载,但是,我需要更新服务中生成的数据,问题是它需要下一行中的活动上下文: Dao接口: 存储库: 服务: 我希望服务在LiveData列表中执行、保存和刷新新结果,但我不能声明LiveData列表。

  • 但是,我还没有想好如何使用solrj API来实现这一点。 有没有人知道用Solrj是否可能?还是solrj没有跟上这个功能的速度? 更新:正如我在邮件列表中所描述的(参见这里的回复),我发现在solrj api中,SolrInputField的值可以是一个映射--它不一定必须是一个简单的标量值。如果它是一个映射,solrj会向字段的xml元素添加一个额外的属性。例如,以下代码: 在这个例子中,我

  • 我的设备有一个前台服务,需要全天候工作。有时当gms更新发生时,它会杀死所有的gms服务 我的服务也使用gms(firbase AuthService),所以它也会被杀死 如何停止更新我的服务时,其他gms服务得到更新。我需要防止我的服务不能再次启动,而gms更新。 这里有一些日志:-- ActivityManager:调度重启崩溃的服务com.google.android.gms/.chimer