2013-03-02 53 views
1

我是AngularJS的新手,并且在加载数据时无法获取资源的承诺以重新呈现视图。这导致{{}}被空白(来自承诺)取代,但视图仍然保持这种状态。Angular的Resource Promise在数据加载时不会重新渲染

我已经看到了很多的问题的例子与承诺正在以$解决申请,$消化,$腕表等,并愿意接受这些建议被很想知道我的做法的根本问题。这里是我的控制器代码

<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 /库/ angularjs/1.0.5 /角resource.min.js'

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

+2

看起来好像你需要多花一点时间学习如何构造角码。另外请注意,$ resource'创建了一个资源对象,它允许您与RESTful服务器端数据源进行交互(来自角度文档)。从你的例子看来,你看起来并不像是在呼唤一个宁静的服务。如果您只想进行常规的ajax调用,那么使用低级别的$ http服务并将其包装在自定义服务中,以在发生任何错误之前中断您的应用程序。查看http://www.yearofmoo.com了解这个和其他有用的例子。 – supermasher 2013-03-02 10:24:21

回答

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> 

由于角度是基于承诺,有可能的响应性结合的$ HTTP或直接$资源行动的HTML,当它得到解决,角度改变属性。

如果可能,请从服务器响应中删除包装({posts: []}[])。如果你这样做,你需要提示响应是一个数组的资源。查看docs了解更多信息。发生

的错误,因为当你调用一个方法上的资源,它返回一个空的对象,所以没有.posts它。但是,如果你将它绑定到你的代码,角将等到它到达那里。

这就是你应该在前端做的所有事情,你确定服务器能回答什么吗你确定你需要一个帖子来检索数据

+0

绝对**辉煌**。奇迹般有效。我现在明白了:承诺没有“帖子”键,所以绑定没有生效。我需要将(整个)承诺绑定到html,然后在数据将位于承诺内的html中指定。或者,从服务器中删除帖子密钥并使用isArray:true也可以。最后,对于你的观点和@supermasher关于代码质量,我的道歉,这只是示例代码 - 我知道用POST获取数据并不完全安静。 – user1649082 2013-03-02 17:46:08

+0

@ user1649082我不认为您正确使用“承诺”一词。 “承诺”不是你的榜样。 $ resources只使用promises * internal *来最终更新它返回给你的数组内容。所有的承诺是一个具有'then'函数的对象,你可以传递回调。 – 2013-06-04 00:38:41

+0

或者,您可以使用Restangular库,并将其配置为考虑嵌套响应。 – Nitrodist 2013-08-06 15:20:16

相关问题