【发布时间】:2015-08-23 20:39:47
【问题描述】:
我一直在玩 angular 试图了解它如何管理范围,然后我发现我无法使用函数调用更新指令中的变量。
为了说明这个问题,这是我的简单应用程序: 这个想法是,当您单击切换链接时,菜单应该会显示出来,而当您再次单击它或其他地方时,菜单应该会消失。
angular.module('app', [])
.controller('DemoController', ['$scope', function($scope) {
}])
.directive('dropdown', function() {
return {
restrict: 'E',
transclude: true,
controller: function($scope) {
$scope.onBlur = function () {
// this doesn't actually work
$scope.showMenu = false;
};
},
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body id="body" ng-app="app" ng-controller="DemoController">
<dropdown ng-transclude>
<a href="#" ng-click="showMenu = !showMenu" ng-blur="onBlur()">Toggle</a>
<menu ng-show="showMenu">
<div>I'm</div>
<div>the drop-down</div>
<div>menu</div>
</menu>
</dropdown>
</body>
这是我的 plunker 链接:
非工作版本: http://plnkr.co/edit/rfdt5FEoGAOX15RZUsKA?p=preview
工作版本: http://plnkr.co/edit/xMANGDVa8n64OKK3gOgg?p=preview
工作版本和另一个的区别在于工作版本只是使用ng-blur="showMenu = false"而不是调用函数。如果我在控制器函数中调用$scope.$apply(),那么我会得到“$apply already in progress”异常。
我想我一定在这里遗漏了一些东西,但我现在不知道为什么。提前致谢。
【问题讨论】:
-
不要使用
$scope.$apply()。使用$timeout( function(){ .... })。它将避免“已经在进行中”错误。 -
@JeremyThille 这里都不需要。
-
不过,诀窍仍然存在 =)
-
真的!值得注意,但也值得注意的是,如果可能的话,两者都不应该使用。 @NSF 您对
$scope.showMenu = false的使用很好,您在控制器中所做的事情是正确的 - 但是我不禁认为这是由于 Angular 处理焦点/模糊事件的方式
标签: javascript angularjs