我如何使用angular-js $资源?

时间:2015-09-18 13:09:49

标签: javascript angularjs

所以我在使用离子框架构建应用程序时尝试使用angular-js $ resource函数。但我似乎无法使其发挥作用。 相关代码:

Service.js

.factory('Pages', function($resource) {
    var source = $resource("http://localhost:5432/api/pages",{},
    {query: { method: "GET", isArray: false }});
    return source;
})

controllers.js

.controller('PagesCtrl', function($scope, Pages) {
$scope.pages =  Pages.query();
$scope.results = $scope.pages.results;
console.log($scope.results);
})

browse.html

<ion-view view-title="Browse">
  <ion-content>
    <h1>Browser</h1>
    <ion-list>
      <ion-item ng-repeat="page in results">
        <h2>{{page.title}}</h2>
      </ion-item>

    </ion-list>
  </ion-content>
 </ion-view>

和数据

{
"count": 2,
"next": null,
"previous": null,
"results": [
    {
        "id": 1,
        "parent": null,
        "title": "Blog",
        "content": "<p>Blog</p>",
        "content_model": "richtextpage",
        "slug": "blog",
        "publish_date": null,
        "login_required": false,
        "meta_description": "Blog",
        "tags": ""
    },
    {
        "id": 2,
        "parent": null,
        "title": "Lorem Ipsum",
        "content": "Lorem ipsum ....",
        "tags": ""
    }
]
}

但控制台日志(在controllers.js中)将始终打印'undefined'。我已经好几个小时了,我似乎无法找到错误。

3 个答案:

答案 0 :(得分:2)

$ scope.pages是一个承诺。要写入控制台,您需要使用这样的回调函数:

$scope.pages = Pages.query();
$scope.pages.$promise.then(function (result) {
  console.log(results);
});

答案 1 :(得分:2)

.query()的实际结果对象是一个保留结果的承诺。

因此,当您尝试访问有效负载的result属性时,可能是请求尚未完成。

但是,Angular ng-repeat语句内置了对promises的支持,因此在您的视图中,如果您这样做,则使用browse.html:

  <ion-item ng-repeat="page in pages.results">

而不是在控制器中处理$scope.results,一切都应该看起来更好。

答案 2 :(得分:0)

以下是我对该服务的建议:

.factory('Pages', function($resource) {
    return {
       source: $resource("http://localhost:5432/api/pages",{},
                   { 
                      query: { 
                          method: "GET", 
                          isArray: false 
                      }
                    })
    }
})

然后在ctrl:

.controller('PagesCtrl', function($scope, Pages) {
    $scope.pages =  Pages.source.query();
    $scope.results = $scope.pages;
    console.log($scope.results);
})

但是你知道查询只返回一个对象,因为你告诉$resource你的查询没有返回一个数组(它是假的)。

只有在你的后端定义正确时才能使用。