加载数据时,Angular Resource Promise不会重新呈现

时间:2013-03-02 08:49:34

标签: javascript binding angularjs promise angularjs-scope

我是AngularJS的新手,我很难获得资源承诺在加载数据时重新渲染视图。这会导致{{}}被替换为空白(来自promise),但是视图就会保持这种状态。

我已经看到许多问题的例子,使用$ apply,$ digest,$ watch等来解决承诺,并且对这些建议持开放态度,我很想知道我的方法的根本问题。这是我的控制器代码

<div ng-controller='pook'>
<p>There are {{posts.length}} posts</p>
<div ng-repeat='post in posts'>
    <h3>{{post.title}}</h3>
    <div>{{post.text}}</div>
    <a href='/readPost/{{post.id}}'>More</a>
    |  -
    <a href='/editPost/{{post.id}}'>Edit</a>
    |  -
    <a href='/deletePost/{{post.id}}'>Delete</a>
</div>
</div>
<script type='text/javascript'>function pook($scope, $http, $route, $routeParams, $resource)
{
/*Approach #1 does work
$http.post('/').success(function(data, status, headers, config)
{
  $scope.posts = data.posts;
});
*/

var User = $resource('/');

/*Approach #2 does work
User.save('', function(data)
{
  $scope.posts = data.posts;
})
*/

//Approach #3 does NOT work -> renders blanks and never re-renders on loaded data
$scope.posts = User.save().posts
}
</script>

我加载的脚本是

// ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js' //ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular-resource.min.js'

我想要的承诺行为的描述在这里 http://docs.angularjs.org/api/ngResource。$资源

1 个答案:

答案 0 :(得分:2)

将您的抓取更改为:

var User = $resource('/');
$scope.postsResponse = User.$save();

和你的绑定:

<div ng-repeat='post in posts'>
  <h3>{{postResponse.post.title}}</h3>
  <div>{{postResponse.post.text}}</div>
</div>

由于angular基于promises,因此可以将$ http或$ resource操作的响应直接绑定到HTML,当它被解析时,angular会更改属性。

如果可能,请从服务器响应中删除包装器({posts: []}[])。如果执行此操作,则需要提示响应为数组的资源。查看docs了解更多信息。

发生错误是因为当您在资源上调用方法时,它会返回一个空心对象,因此它没有.posts。但是如果你将它绑定到你的代码,angular会等到它到达那里。

这是你应该在前端做的所有事情,你确定服务器能够回答预期的结果吗? 您确定需要帖子来检索数据吗?