2

我是 AngularJS 的新手,我目前正在使用 Django/Tastypie API 构建一个 webapp。这个 web 应用程序适用于帖子,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. 如何缓存此值以避免在同一端点上进行多次调用?

同样,我是 angularJS 的新手,我可能在理解$resource对象时遗漏了一些东西。

谢谢,马克西姆。

4

1 回答 1

1

关于问题一,我知道没有简单的、开箱即用的解决方案。我想您可以使用自定义响应转换器来启动辅助 $resource 请求,将来自这些请求的承诺附加为响应对象的属性(代替 URL)。$resource 工厂的最新版本允许您指定$resource 实例的这种转换器。您将委托给全局默认响应转换器 ($httpProvider.defaults.transformResponse) 以获取您的实际 JSON,然后替换属性并从那里启动辅助请求。请记住,当以这种方式进行委派时,传递您自己的响应转换器在调用时收到的前两个参数,而不是一个参数,即使文档只提到了一个(我很难学会这一点)。

没有办法知道每个最后一个承诺何时都已实现,但我认为您不会有任何依赖于这些知识的代码(因为您的 UI 通常只绑定到模型对象的点点滴滴,本身是一个承诺,由原始 HTTP 请求返回)。

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

这是在客户端组装资源的大量工作(和往返),而在应用程序层组装聚合并预先提供服务可能要容易得多。REST 对数据规范化没有任何期望。

于 2013-03-19T03:54:00.923 回答