【发布时间】:2014-09-03 21:48:48
【问题描述】:
所以,重要的部分: 当我将控制器中的 $scope 变量直接绑定到 $resource 时,Angular 的自动承诺解析会接管,并且一旦从服务返回数据,我的视图就会更新。但是,我需要定期轮询服务器以获取更新。尝试绑定到从 $interval 调用返回的承诺不会触发 Angular 的自动承诺解决方案,我不知道是否可以做一些事情来让这个 $interval 对 $resource 起作用。
Angular 客户端,提供 JSON 的 ASP.NET WebApi,位于 WebApi 之上的 Angular $resource。在我的角度控制器中,如果我将 $scoped 变量直接绑定到我的 $resource 承诺,我会得到结果;但是,我需要我的 $resources 在 $interval 上更新,我在引入间隔时遇到了问题。
“需要手动刷新”的工作代码(至少是相关部分)
'use strict';
var ctrls = angular.module('MyModule',[]);
ctrls.controller('FooCtrl', ['$scope', '$location','service',
function( $scope,$location,service)
{
$scope.Bars = service.Bars;
$scope.Baz = service.Baz;
}
var app = angular.module('MyModule.Services',['ngResource']);
app.service('service', ['$resource', function($resource)
{
var proxy = $resource(
'http://server/subsystem/api/Foo/:component',
{},
{
Bars: {method:'GET',isArray:false,url: 'http://server/subsystem/api/Foo/Bars'
,Baz: {method:'GET',isArray:false,rul: 'http://server/subsystem/api/Foo/Baz'
}
return proxy;
}]);
blah blah blah,在我看来,ng-repeat 绑定到“bar in Bars”=要筛选的数据。
所以现在,我进入我的控制器来实现我的间隔,我可以让间隔工作,但承诺没有解决。
控制器内部的变化(注意我在依赖列表中添加了 $interval 和 $document:
var stop;
$scope.Bars = {};
$scope.Baz = service.Baz; //Note that angular resolves this promise automatically.
$scope.pollService = function(){
if(angular.isDefined(stop))return;
stop = $interval(function(){
if(service){
$scope.Bars = service.Bars;
}
},1000);
};
$scope.stopPolling = function(){
if(angular.isDefined(stop)){
$interval.cancel(stop);
stop = undefined;
}
};
$scope.$on('$destroy',function(){
$scope.stopPolling();
});
$document.ready(function(){
$scope.pollService(); //when I attempt to execute my .then() on pollService(), I get "cannot
//call then on undefined"
});
编辑
请注意,我遇到的问题是将 $scope.Bars 直接绑定到 service.Bars 会触发 Angular 的自动承诺解决方案,但似乎没有引入 $interval 调用。在 Chrome 开发工具中检查 $scope.Bars 表明它是一个未解决的承诺。
我更新了我的示例代码以匹配我当前在调试器中的内容。我在我的资源上定义了几个属性,其中包括一个我命名为“Baz”的属性。如果我直接在我的控制器中分配 $scope.Baz = service.Baz ,则视图会在 Angular 解决承诺时绑定到它,但间隔上的承诺永远不会。
【问题讨论】:
-
转录我的代码时出错。我会清理的
标签: javascript angularjs angular-resource angular-promise