Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 为什么我需要作用域。设置$location.path时应用$apply_Angularjs_Scope - Fatal编程技术网

Angularjs 为什么我需要作用域。设置$location.path时应用$apply

Angularjs 为什么我需要作用域。设置$location.path时应用$apply,angularjs,scope,Angularjs,Scope,在这个简单的例子中,我有一个指令截取对元素的点击,然后使用$location服务导航到某个地方。为什么我需要将$location.path()调用包装在$scope.$apply中 HTML: Fiddle:您通常不需要它,因为使用angular$location服务更新位置需要一个摘要周期。在您的情况下,之所以需要它,是因为您是从手动绑定的click事件(而不是使用ng click)调用scope函数的,而手动绑定的click事件在angular上下文之外(angular不知道是否发生了某个事

在这个简单的例子中,我有一个指令截取对元素的点击,然后使用$location服务导航到某个地方。为什么我需要将$location.path()调用包装在$scope.$apply中

HTML:


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