Angular - ngResource打破数据绑定

时间:2015-07-06 16:27:02

标签: javascript angularjs ngresource

我是Angular的新手,我正在尝试使用ngResource

我在chapter.service.js文件中创建了一个工厂

angular.module('myApp')
.factory('Chapter', function ($resource) {
  return $resource('/api/book/chapter/:id'); // Note the full endpoint address
});

matchescontroller.js

angular.module('myApp').controller('matchesCtrl', function($scope, $location, Chapter) {

// This is used to get URL parameters

$scope.url = $location.path();
$scope.paths = $scope.url.split('/');
$scope.id = $scope.paths[2];
$scope.action = $scope.paths[3];

//Trying to call the test data
    var chapters = Chapter.query();

    $scope.myFunction = function() {
        alert(chapters.length);
    }

我在哪里测试功能

<button ng-click="myFunction()">Click Here</button>

我创建了一个测试函数来测试我的查询是否返回了任何结果。当我点击按钮时,我被警告0,这意味着查询无效。

当我将功能更改为

$scope.myFunction = function() {
    console.log(Object.keys(chapters));
}

我得到[$promise, $resolve],但没有一个架构密钥

我一定做错了,但我正在看这个教程

http://www.masnun.com/2013/08/28/rest-access-in-angularjs-using-ngresource.html

任何帮助将不胜感激。

编辑:这是我从服务器获得的回复

GET http://localhost:9000/api/book/chapter/1 500 (Internal Server Error)

2 个答案:

答案 0 :(得分:2)

$scope.myFunction = function() {
    Chapter.query({}, function(data) {
        $scope.chapters = data;
    }, function(error) {
        // custom error code
    });
}

使用$ resource时,我更喜欢使用API​​附带的成功/错误处理程序,而不是直接处理promise。要实现的重要一点是,仅仅因为您调用查询并不意味着结果立即可用。因此,使用一个回调来处理成功/错误取决于你的后端返回什么。只有这样,你才能在UI中绑定和更新reuslt。

此外,虽然我们正在谈论它,但我注意到您没有在$ resouce网址中连接可选参数。 $ resource采用第二个参数,该对象为路径的/:id部分提供映射。

return $resource('/api/book/chapter/:id', {id: '@id'});

这种表示法的含义是你将一个对象传递给具有id属性的$ resource,它将被载入你的URL。

所以这个:

$scope.item = {id: 42, someProp: "something"};

Chapter.get({$scope.item}....

将导致API调用看起来像'/api/book/chapter/42'

答案 1 :(得分:1)

你从$ resource获得了一个承诺而不是&#34;结果&#34;来自您的数据库。结果在承诺里面。所以试试这个

var chapters = Chapter.query();

$scope.myFunction = function() {
    chapters.then(function(data) {
       console.log(data);
    });
}

我必须承认,我不熟悉ngResource,所以Jessie Carters是对的,正确的语法是:

chapters.get({...}, function callback() {...})