Angularjs 为什么我需要作用域。设置$location.path时应用$apply
在这个简单的例子中,我有一个指令截取对元素的点击,然后使用$location服务导航到某个地方。为什么我需要将$location.path()调用包装在$scope.$apply中 HTML:Angularjs 为什么我需要作用域。设置$location.path时应用$apply,angularjs,scope,Angularjs,Scope,在这个简单的例子中,我有一个指令截取对元素的点击,然后使用$location服务导航到某个地方。为什么我需要将$location.path()调用包装在$scope.$apply中 HTML: Fiddle:您通常不需要它,因为使用angular$location服务更新位置需要一个摘要周期。在您的情况下,之所以需要它,是因为您是从手动绑定的click事件(而不是使用ng click)调用scope函数的,而手动绑定的click事件在angular上下文之外(angular不知道是否发生了某个事
Fiddle:您通常不需要它,因为使用angular
$location
服务更新位置需要一个摘要周期。在您的情况下,之所以需要它,是因为您是从手动绑定的click事件(而不是使用ng click)调用scope函数的,而手动绑定的click事件在angular上下文之外(angular不知道是否发生了某个事件,并且它已经更新了scope)。另外,您将它放在了错误的位置,因为当您使用scope.apply
时,它必须放在调用堆栈的顶部,即起始位置,否则在角度上下文中调用时,您的scope函数将变得不可用。当您在控制器中手动执行摘要循环时,有时这也是一件奇怪的事情
例如:
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
});
}
}
});
angular.module('app')。指令('myHref',function(){
返回{
控制器:功能($scope,$location){
$scope.navigate=函数(路径){
$location.path(路径);
};
},
链接:功能(范围、要素、属性){
元素绑定('单击',函数(){
scope.navigate(attrs.myHref);
作用域:$apply()//
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);
});
}
}
});
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
});
}
}
});