2013-01-21 26 views
3

我是AngularJS的新手,所以这可能实际上指向一些我尚未完全理解的核心概念。我正在尝试使用$q & promise对象来处理“本地数据”之类的“远程数据”。直到没有获取远程数据时,promise对象才会解析,但只要解析完成,我就想要更新视图中所有依赖的数据绑定。但是,以下方法导致无限循环,其中remote_total被重复调用,即使之前调用remote_total导致解析的承诺对象。AngularJS - 由于承诺对象造成的无限循环

这是我的看法是什么样子

<div ng-controller="MyController"> 
    {{ remote_total() }} 
</div> 

下面是来自控制器的相关片段:

function MyController($scope, $q, $http) { 
    $scope.remote_total = function() { 
    var def = $q.defer(); 
    $http.get('/my/remote/service.json').success(function(data) { 
     def.resolve(data); 
    }); 
    return def.promise; 
    } 
} 

首先,这将是巨大的,如果任何人都可以向我解释为什么恰恰是这个进入一个无限循环。其次,什么是实现我想要做的最好的方法?

回答

5

注:角1.2+

与AngularJS的承诺,其实有趣的事情(即$q提供),他们正在通过AngularJS认可见下更新。而另一个他们是可链接的!

因此,在你的代码,你可以做

$scope.remote_total = $http.get('/my/remote/service.json').then(function(data) { 
    return data; 
}); 

,并在视图只是<div>{{remote total}}</div>(注:没有的功能,只是值)。

和AngularJS会自动识别它的承诺,解析$ http.get承诺,然后链接到你的函数,并把结果值放入模板。

这是所有:)

UPDATE:承诺自动去包装中默认AngularJS 1.2禁用,会在1.3被完全删除。

代码,将工作:

$http.get('/my/remote/service.json').then(function(data) { 
    $scope.remote_total = data; 
}); 
+0

我怎么不得不说“ {{remote_total}}'而不是'{{remote_total()}}'。这仅仅是角度魔术还是两者在意义上存在实际差异? –

+0

Angular检测到,它是一个承诺,并在显示之前解决它 –

+1

我认为只需'$ scope.remote_total = $ http.get('/ my/remote/service.json')'就足够了。 –

3

Angular做脏检查来实现2路绑定。在每个周期中,它存储正在观看的属性的先前值,并将其与新值进行比较。如果该属性是一个函数,则调用它并对结果进行比较。

你确实放了一个被监视的函数,并且在每个循环中你的函数被调用,因此导致http请求。

你想要做的是创造自己的承诺,并附上承诺范围观看(或显示在视图中)。

此外,$ http服务已经返回一个承诺,您不需要创建另一个承诺。

function MyController($scope, $q, $http) { 
    $scope.getRemoteTotal = function() { 
    var def = $http.get('/my/remote/service.json').success(function() { 
     $scope.remoteTotal = data; 
    }); 
    } 
    $scope.getRemoteTotal(); 
} 

<div ng-controller="MyController"> 
    {{ remoteTotal }} 
</div> 
+0

所以,如果我理解正确此,'{{remote_total}}'设置的功能的手表,这将意味着角会调用该函数的每个DIGEST-循环(?)来确定它是否已经改变。每次调用时,都会发出HTTP请求。正确? –

+0

是的,如果正在观看的项目是一个函数,则在每个循环中调用它。这里misko的(核心开发人员之一)对角度的数据绑定的解释http://stackoverflow.com/questions/9682092/databinding-in-angularjs –

+3

这是非常深奥 - 甚至不直观 - 行为从角 –