AngularJS美元范围.$apply vs $q



我在理解上有点困难,有人能解释一下这段代码之间的区别吗:

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;
})

谢谢

这里发生的基本事情是代码使用了浏览器原生API (navigator.geolocation.watchPosition),而angularjs没有内置支持。AngularJS直接支持大多数东西($timeout, $window, $http, $location等),但是这个特殊的东西并没有被嵌入到angular中。这仍然是可以使用的,但是你需要告诉angular异步操作何时完成,这样angular就知道重新评估作用域,这样它就可以检测到什么发生了变化,触发所有的绑定,并通常发挥它的魔力。

以上两种方法最终都达到了相同的结果,它们只是使用了不同的技术来实现它。$q.defer()是承诺风格的变体,$scope.$apply是回调风格的变体,但它们在您的示例中所做的基本上是相同的。

最新更新