为什么我需要一个范围。$ apply在设置$ location.path时应用

时间:2015-02-03 15:23:09

标签: angularjs scope

给出这个简单的例子,我有一个指令拦截元素上的点击,然后使用$ location服务在某处导航。为什么我需要在$ scope中包装$ location.path()。$ apply?

HTML:

<a my-href="/">Click me</a>

脚本:

angular.module('app').directive('myHref', function(){
        return {
            controller: function($scope, $location){
                $scope.navigate = function(path){
                    $scope.$apply(function(){
                        $location.path(path);
                    });
                };

            },
            link: function(scope, elem, attrs){
                elem.bind('click', function(){
                   scope.navigate(attrs.myHref);
                });
            }
        }
    });

小提琴:http://jsfiddle.net/basslagter/4mya2uv0/

1 个答案:

答案 0 :(得分:3)

您通常不需要它,因为使用角度$location服务更新位置需要一个摘要周期来更新位置。在你的情况下你需要它,因为你从手动绑定的点击事件(而不是使用ng-click)调用范围函数,这是在角度上下文之外(角度不知道是否发生了某些事件并且它已经更新了范围) 。你也把它放在错误的地方,因为当你使用scope.apply时,它必须放在调用堆栈的顶部,即原点,否则你的范围函数在角度上下文中被调用时变得不可用。当你在控制器中手动执行摘要循环时,有时候这也是一件奇怪的事。

例如:

 angular.module('app').directive('myHref', function(){
    return {
        controller: function($scope, $location){
            $scope.navigate = function(path){
               $location.path(path);
            };

        },
        link: function(scope, elem, attrs){
            elem.bind('click', function(){
               scope.navigate(attrs.myHref);
               scope.$apply(); //<-- Here
            });
        }
    }
});