Javascript 控制器函数调用中的角度范围变量更新不';不能在指令html中得到反映

Javascript 控制器函数调用中的角度范围变量更新不';不能在指令html中得到反映,javascript,angularjs,Javascript,Angularjs,我一直在玩angular,试图了解它是如何管理作用域的,然后我发现我无法使用函数调用更新指令中的变量 为了说明这个问题,下面是我的简单应用程序: 这个想法是,当你点击切换链接时,菜单应该显示出来,当你再次点击它或其他地方时,菜单应该消失 angular.module('app',[]) .controller('DemoController',['$scope',函数($scope){ }]) .directive('dropdown',function(){ 返回{ 限制:'E', 是的,

我一直在玩angular,试图了解它是如何管理作用域的,然后我发现我无法使用函数调用更新指令中的变量

为了说明这个问题,下面是我的简单应用程序: 这个想法是,当你点击切换链接时,菜单应该显示出来,当你再次点击它或其他地方时,菜单应该消失

angular.module('app',[])
.controller('DemoController',['$scope',函数($scope){
}])
.directive('dropdown',function(){
返回{
限制:'E',
是的,
控制器:功能($scope){
$scope.onBlur=函数(){
//这实际上不起作用
$scope.showMenu=false;
};
},
};
});

我是
下拉列表
菜单

首先,关于$scope.$apply()函数,只有当$scope.$$phase为空时才可以调用它(确保它不在$digest或$apply phase中)

在您的第一个plunker中,仅更改以下内容:

$scope.showMenu = false;
to 
this.showMenu = false;

它的in函数和函数已经是$scope bind。

不要使用
$scope.$apply()
。使用
$timeout(function(){….})
。它将避免“已在进行中”错误。@JeremyThille在这里都不是必需的。不过,技巧仍然有效=)正确!值得注意,但也值得注意的是,如果可能的话,两者都不应使用@NSF您使用的
$scope.showMenu=false
很好,您在控制器中所做的是正确的-但是我忍不住认为这是由于Angular处理聚焦/模糊事件的方式造成的,这完全起到了作用!通过使用console.log,似乎在函数调用中,“this”指的是原始范围,$scope是一个新范围。我想知道是否有文档提到了这种行为的原因。这是javascript的问题,而不是angularjs的问题。您已经在$scope下定义了函数,在这个函数中,“this”与原来的$scope相同,但是如果在函数中使用$scope,javascript会将这个变量绑定到完全不同的$scope。这就是我得到的-console.log(this):ChildScope{$$childTail:null,$$childHead:null,$$nextSibling:null,$$watchers:Array[1],$$listeners:Object…},console.log($scope):Object{$$childTail:ChildScope,$$childHead:ChildScope,$$nextSibling:null,$$watchers:null,$$listeners:Object…}。请问第二个作用域来自哪里?@NSF第二个作用域是在使用
ng transclude
时创建的。我知道这是一个冗长的问题,但这个答案非常棒:@AlexG实际上我后来发现这不是javascript的问题,但仍然有棱角。使用transclude时,angular将创建一个不在指令作用域下但在指令作用域旁边的同级作用域。调用函数时,angular将转置模板中的作用域绑定到该函数中的“this”引用。$scope变量仍然是原封不动的指令作用域,因为它是同级作用域,所以更改不会被原型继承到另一个作用域。
$scope.showMenu = false;
to 
this.showMenu = false;