Javascript 无法调用作用域指令上的方法

Javascript 无法调用作用域指令上的方法,javascript,angularjs,angularjs-directive,isolate-scope,Javascript,Angularjs,Angularjs Directive,Isolate Scope,给出了下面的示例,我很好奇为什么作用域:true能够像预期的那样切换元素。但是,如果使用了scope:{},则ng click不会调用切换方法。通过我自己的实验,无论是否使用bindToController和ControllerA,都没有什么区别,问题是一样的 (函数(角度){ "严格使用",; 角度模块('测试',[])) .directive('collapsibleMenu',[function(){ 返回{ 作用域:{},//不起作用 //范围:true,//works 限制:“A”,

给出了下面的示例,我很好奇为什么
作用域:true
能够像预期的那样切换元素。但是,如果使用了
scope:{}
,则
ng click
不会调用切换方法。通过我自己的实验,无论是否使用bindToController和ControllerA,都没有什么区别,问题是一样的

(函数(角度){
"严格使用",;
角度模块('测试',[]))
.directive('collapsibleMenu',[function(){
返回{
作用域:{},//不起作用
//范围:true,//works
限制:“A”,
控制器:函数(){
var ctrl=this;
ctrl.open=false;
ctrl.toggle=函数(){
ctrl.open=!ctrl.open;
console.log('toggle',ctrl.open);
}
},
bindToController:对,
controllerAs:'ctrl'
};
}]);
})(窗口角度)

切换菜单0
切换菜单1

我不是指令和范围继承的大师,但让我印象深刻的是,您的指令并不是真正的指令:它没有链接功能,标记中包含的代码应该真正位于模板中。 指令标记中代码的重复证明了该指令是无用的:您还可以直接在HTML中声明控制器本身。

出于某种原因,它被称为isolat(ed)。隔离作用域中的
ctrl
中的
ctrl
不同


我猜误解是因为您认为
的内容是指令的内容,但事实并非如此<代码>可折叠菜单
与页面的其余部分完全“隔离”(原文如此!)。

您可以通过这种方式使用

HTML:

<div ng-app="test">
        <div collapsible-menu>
            <button ng-click="toggle()">toggle menu 0</button>
            <ul role="menu" ng-show="open" class="ng-cloak">
                <li><a href="#">link</a></li>
                <li><a href="#">link</a></li>
                <li><a href="#">link</a></li>
            </ul>
        </div>
        <div collapsible-menu>
            <button ng-click="toggle()">toggle menu 1</button>
            <ul role="menu" ng-show="open" class="ng-cloak">
                <li><a href="#">link</a></li>
                <li><a href="#">link</a></li>
                <li><a href="#">link</a></li>
            </ul>
        </div>
    </div>
angular.module("test", []).
directive("collapsibleMenu", function () {
    return {
        restrict: "A",
        transclude: true,
        scope: {},
        link: function (scope, element, attrs, ctrl, transclude) {

            transclude(scope, function (clone) {
                element.append(clone);
            });

            scope.open = false;
            scope.toggle = function () {
                scope.open = !scope.open;
                console.log('toggle', scope.open);
            };
        }
    };
});

定义不起作用:)@OlaviSau我认为问题很清楚。ng click不会调用
ctrl.toggle
方法来切换文档中的section.its“true”创建“一个新的子作用域,该子作用域通常从其父级继承”。当{}创建一个“隔离”作用域时。如果要使用隔离作用域,则应使用此html内容切换菜单的模板0
    • 这不是我们的一部分,正如zeroflagL所说。您可以使用指令模板或ng transclude使其工作。像您那样声明ng click不是指令范围的一部分(它是独立的),而是ctrl的一部分。。