Javascript 角度';s的资源承诺在加载数据时不重新呈现

Javascript 角度';s的资源承诺在加载数据时不重新呈现,javascript,binding,angularjs,promise,angularjs-scope,Javascript,Binding,Angularjs,Promise,Angularjs Scope,我是AngularJS的新手,在加载数据时很难得到resource重新渲染视图的承诺。这导致{{}被替换为空格(来自承诺),但视图仍然是这样 我已经看到了许多关于承诺问题的例子,这些问题是通过$apply、$digest、$watch等解决的,我愿意接受这些建议。我很想知道我的方法的根本问题。这是我的控制器代码 <div ng-controller='pook'> <p>There are {{posts.length}} posts</p> <div

我是AngularJS的新手,在加载数据时很难得到resource重新渲染视图的承诺。这导致{{}被替换为空格(来自承诺),但视图仍然是这样

我已经看到了许多关于承诺问题的例子,这些问题是通过$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>

有{{posts.length}}个帖子

{{post.title} {{post.text} | - | - 函数pook($scope、$http、$route、$routeParams、$resource) { /*方法1确实有效 $http.post('/').success(函数(数据、状态、标题、配置) { $scope.posts=data.posts; }); */ var User=$resource('/'); /*方法2确实有效 User.save(“”,函数(数据) { $scope.posts=data.posts; }) */ //方法#3不起作用->渲染空白,并且从不在加载的数据上重新渲染 $scope.posts=User.save().posts }
我加载的脚本是

//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'

这里是我想要的承诺行为的描述 .$resource

将获取更改为:

var User = $resource('/');
$scope.postsResponse = User.$save();
你必须:

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

{{postResponse.post.title}
{{postResponse.post.text}
由于angular是基于承诺的,因此可以将$http或$resource操作的响应直接绑定到HTML,当解析后,angular会更改属性

如果可能,从服务器响应中删除包装器(
{posts:[]}
[]
)。如果这样做,则需要提示资源响应是一个数组。有关更多信息,请参阅

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


这是您在前端应该做的全部工作,您确定服务器满足预期要求吗您确定需要一篇文章来检索数据吗

看起来您需要多花一点时间来学习如何构造角度代码。还要注意,$resource“创建了一个资源对象,允许您与RESTful服务器端数据源进行交互”(来自angular文档)。从您的示例来看,它不像是在调用restful服务。如果您只想进行常规的ajax调用,那么使用低级的$http服务并将其包装到自定义服务中,以便在错误破坏应用程序之前捕获错误。看看这个和其他有用的例子。绝对精彩。工作起来很有魅力。我现在明白了:promise没有“posts”键,因此绑定没有生效。我需要将(整个)承诺绑定到html,然后在html中指定数据在承诺中的位置。或者,从服务器中删除post密钥并使用isArray:true也可以。最后说到您的观点和@supermasher关于代码质量的问题,很抱歉,这只是示例代码-我知道使用POST获取数据并不完全是restful的。@user1649082我认为您没有正确使用“承诺”一词。“承诺”不是你的榜样$资源仅在内部使用承诺来最终更新它返回给您的数组的内容。所有承诺都是一个具有
然后
函数的对象,您可以将回调传递给该函数。或者,您可以使用Restangular库,并将其配置为考虑嵌套响应。