AngularJS $ scope。$ apply vs $ q

时间:2014-08-22 21:51:18

标签: angularjs angular-promise

我在理解方面有点麻烦,有人可以解释这些代码之间的区别:

app.controller('MainCtrl', function($scope,$http) {
if(navigator.geolocation){
    navigator.geolocation.watchPosition(function(position){ //asychronous
        $scope.$apply(function(){
            $scope.position=position;
       });
   });
};

和这个

function getPosition(){
  var deferred=$q.defer();
  if(navigator.geolocation){
    navigator.geolocation.watchPosition(function(position){
        deferred.resolve(position);
    })
  }return deferred.promise;
}

var promise=getPosition();
promise.then(function(position){
    $scope.position2=position;
})

感谢

1 个答案:

答案 0 :(得分:5)

这里发生的基本事情是代码使用的是一个浏览器原生API(navigator.geolocation.watchPosition),angularjs没有内置的支持。 AngularJS直接支持大多数事情($timeout$window$http$location等),但这个特殊的东西并没有被加入到角度。这仍然可以使用但是你需要在异步操作完成时告诉角度,因此angular知道重新评估范围,以便它可以检测已经改变的内容,触发所有绑定并通常发挥其魔力。 / p>

上述两种方法最终都达到了相同的效果,它们只是使用不同的技术来实现。 $q.defer()是承诺风格的变体,$scope.$apply是回调式变体,但它们与您的示例中的内容完全相同。