【问题标题】:Angular's Resource Promise is not re-rendering when data loaded加载数据时,Angular 的 Resource Promise 不会重新渲染
【发布时间】:2013-02-16 19:56:57
【问题描述】:

我是 AngularJS 的新手,在加载数据时无法获得资源承诺重新渲染视图。这导致 {{}} 被替换为空白(来自承诺),但视图保持不变。

我已经看到了很多使用 $apply、$digest、$watch 等解决 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/libs/angularjs/1.0.5/angular-resource.min.js'

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

【问题讨论】:

  • 看来您需要多花一点时间来学习如何构建 Angular 代码。还要注意 $resource '创建一个资源对象,让您与 RESTful 服务器端数据源进行交互'(来自 Angular 文档)。从您的示例来看,您似乎不是在调用一个宁静的服务。如果您只想进行常规的 ajax 调用,请使用低级别的 $http 服务并将其包装在自定义服务中,以便在它们破坏您的应用程序之前捕获任何错误。查看yearofmoo.com 了解此示例和其他有用示例。

标签: javascript binding angularjs promise angularjs-scope


【解决方案1】:

将您的 fetch 更改为:

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 基于 Promise,因此可以将 $http 或 $resource 操作的响应直接绑定到 HTML,当它被解析时,angular 会更改属性。

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

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

这就是你在前端应该做的所有事情,你确定服务器会回答预期的问题吗? 您确定需要发布信息来检索数据

【讨论】:

  • 绝对出色。奇迹般有效。我现在明白了:promise 没有“posts”键,所以绑定没有生效。我需要将(整个)promise 绑定到 html,然后在 html 中指定数据在 promise 中的位置。或者,从服务器中删除 post 键并使用 isArray: true 也可以。最后说到你的观点和@supermasher 关于代码质量,我很抱歉,这只是示例代码 - 我知道使用 POST 获取数据并不完全是宁静的。
  • @user1649082 我认为您没有正确使用“承诺”一词。 “承诺”不是你的榜样。 $resources 只在 internally 使用 promises 来最终更新它返回给你的数组的内容。所有的承诺都是一个带有then 函数的对象,你可以将回调传递给。
  • 或者,您可以使用 Restangular 库,它可以配置为考虑嵌套响应。
猜你喜欢
  • 2016-01-13
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多