给出这个简单的例子,我有一个指令拦截元素上的点击,然后使用$ 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);
});
}
}
});
答案 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
});
}
}
});