将ngResource调用存储到变量中

时间:2013-06-19 23:53:40

标签: angularjs

我正在编写一个使用Rails来提供JSON API的应用程序。我正在使用Angular ngResource模块来使用这些json端点。

虽然我有ngResource,正确配置(见下文)并且可以将其结果存储到$scope变量中或将其记录到控制台,但我很难使用服务来进行ngResource调用并将其结果存储到常规的旧array变量中。

在这个例子中,我有一个名为Genre的资源,它访问我的Rails JSON api。 GenreService注入Genre并尝试制作'Genre.index()call and store those results into a local数组`变量。

以下是文件内容:

Genre.js.coffee

'use strict'

app = angular.module("ATWP")

app.factory "Genre", ($resource) ->
  $resource "/genres/:slug",
    slug: "@slug"
  ,
    create:
      method: "POST"

    index:
      method: "GET"
      isArray: true

    show:
      method: "GET"

    update:
      method: "PUT"

    books:
      method: "GET"

GenreService.js.coffee

'use strict'

app = angular.module('ATWP')

genreService = app.factory 'GenreService', (Genre) ->

  genreResponse = new Array()

  Genre.index((response) ->
    genreResponse = response
  )

  console.log 'Genre Response'
  console.log genreResponse

  getGenres: ->
    genreResponse

此时记录genreResponse将实际显示一个数组。但是,如果我将GenreService注入控制器然后将GenreService.getGenres()的结果存储到数组中,则只要我将其记录到控制台,该数组就会显示为空。

我想知道为什么会这样。我必须使用Promise API吗?任何人都可以帮助我理解这种情况发生了吗?

谢谢你们。

1 个答案:

答案 0 :(得分:1)

console.log genreResponse时,呼叫尚未完成,因此您将拥有一个空数组。

尝试使用$ watch代替(非coffeescript):

$scope.$watch('genreResponse', function (newVal, oldVal) {
  if (newVal) {
    console.log($scope.genreResponse);
  }
});