【发布时间】:2014-11-16 11:41:57
【问题描述】:
我一直在努力思考如何正确使用 angular $scope。我的应用在加载主页时根据从服务器接收到的 json 数据中的 url 链接更新视图。
控制器在单击按钮时获取下一个数据文件,但我无法将此数据注入我的范围变量并更新视图。网络成功传输数据,因此我的服务正在运行。
我不明白如何让 $scope 解决 $resource 承诺并在应用程序初始化后检索数据时更新视图。非常感谢您对此事的任何帮助。
我的 ListController :
//View updates correctly when promise resolves
$scope.data = DataElements.get({});
$scope.nextPage = function (){ //Called when clicking 'next' button
var url = $scope.data.pager.nextPage;
var pageNumber = url.split("page=").pop(); //Ugly but it is temporary, I promise..
//View doesnt update
DataElements.get({'page': pageNumber}, function(data){
$scope.data = data;
});
//Error: Digest already in progress
DataElements.get({'page': pageNumber }, function(data){
$scope.$apply(function(){
$scope.data = data;
});
});
//View doesnt update
$scope.data = DataElements.get({'page': pageNumber)};
};
服务:
services.factory('DataElements', ['$rootScope','$resource', function($rootScope, $resource){
return $resource($rootScope.baseUrl+'api/:endPointAdr.jsonp',
{'endPointAdr': 'dataElements', 'page': '@page'},
{ get : {'method' : 'JSONP', 'params' : {'callback' : 'JSON_CALLBACK'}}
});
}]);
查看:
<section>
<div>
<h1>Search</h1>
<input type="text" placeholder="Type something" autofocus>
<input type="button" name="filter" value="Filter">
<input type="button" name="clear" value="Clear">
<div class="btn-toolbar" role="toolbar" aria-label="...">
<a class="btn btn-default" href="#" aria-label="Previous Page">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
<a class="btn btn-default" href="#" ng-click="nextPage()" aria-label="Next Page">
<span class="glyphicon glyphicon-chevron-right"></span>
</a>
</div>
</div>
<div ng-controller="ListController">
<ul class="" ng-show="data">
<li class="" ng-repeat="element in data.dataElements ">
<a href="#">
<div class="info">
<h2>{{element.name}}</h2>
</div>
</a>
</li>
</ul>
</div>
</section>
服务器响应:
DataElements.get({}) == >
angular.callbacks._1({"pager": {"page":1,"pageCount":15,"total":706,"nextPage":"http// ...});(*)
DataElements.get({'page': 2}) == >
angular.callbacks._2({"pager": {"page":2,"pageCount":15,"total":706,"nextPage":"http:// ...});(*)
(*) $resource 去掉 jsonp 并且只返回 json。
更新:
如果我只在nextPage 函数范围内分配$scope.data,它就可以完美地工作。我知道ng-clickdirective 将此函数包装在$scope.apply() 中。然后,显式调用 apply 会导致错误是有道理的。
解决方案:
<div ng-controller="ListController"> 创建了一个具有不同 $scope 的重复控制器。删除它解决了问题。详情见我的回答。
【问题讨论】:
-
不确定是否为
jsonp配置了$resource。你试过$http.jsonp()吗?服务器实际上是在传递jsonp吗? -
我没试过,但是第一个请求成功返回jsonp。
-
第二个(分页)调用是否返回数据?你怎么看?
-
我已经更新了帖子。第二页返回具有相同结构的数据,除了一个额外的 pagePrevious 属性。
标签: angularjs angularjs-scope angularjs-ng-click angular-promise angularjs-view