使用angularJS'$ resource取消引用对象

时间:2013-03-18 21:35:46

标签: angularjs angular-resource

我是AngularJS的新手,我目前正在使用Django / Tastypie API构建一个webapp。此webapp适用于帖子,API调用(GET)如下所示:

{
    title: "Bootstrap: wider input field - Stack Overflow",
    link: "http://stackoverflow.com/questions/978...",

    author: "/v1/users/1/",

    resource_uri: "/v1/posts/18/",
}

为了请求这些对象,我创建了一个angular的服务,它嵌入了如下所示的资源:

Post: $resource(ConfigurationService.API_URL_RESOURCE + '/v1/posts/:id/')

一切都像魅力一样,但我想解决两个问题:

  1. 如何正确替换author字段的值?换句话说,请求如何尽可能自动地每个参考字段?
  2. 如何缓存此值以避免在同一端点上进行多次调用?
  3. 同样,我是angularJS的新手,在理解$resource对象时我可能会遗漏一些东西。

    谢谢, 马克西姆。

1 个答案:

答案 0 :(得分:1)

关于问题一,我知道没有琐碎,开箱即用的解决方案。我想您可以使用自定义response transformers来启动辅助$ resource请求,将这些请求中的promises作为响应对象的属性(代替URL)附加。最新版本的$ resource factory allow you to specify这样的$ resource实例的转换器。您将委托全局默认响应转换器($ httpProvider.defaults.transformResponse)来获取您的实际JSON,然后替换属性并从那里启动子请求。请记住,在委托这种方式时,要传递自己的响应变换器在调用时接收的第一个TWO而不是一个参数,即使文档只提到一个(我很难学到这一点)。

没有办法知道每一个最后的承诺何时完成,但我认为你不会有任何依赖于这些知识的代码(因为你的UI通常被束缚到模型对象,本身是一个promise,由原始HTTP请求返回。)

关于问题二,我不确定你是指你的主要对象(在这种情况下,$ scope应该足以作为保留引用的方法)或者你打算下载的这些辅助对象作为一种手段在客户端组装聚合。假设后者,我猜你可以做一些事情,比如维护一个与你的$ scope中的对象相关的URL的哈希值,并且让你的子资源$ resource请求上的成功函数更新这个字典。然后你可以让我上面描述的响应变换器首先检查哈希是否已经获得了所需的资源实例,只有在没有这样的本地副本时才从后端获取$ resource。

这是在客户端组装资源的一大堆工作(和往返),只需在应用程序层中组装聚合并预先提供服务就可以更容易。 REST没有对数据规范化的期望。