如果不使用隔离作用域,我似乎无法找到一种方法来从指令内调用父作用域上的函数。我知道如果我使用隔离范围,我可以在隔离中使用“&”来访问父范围上的函数,但是在没有必要时使用隔离范围会产生后果。考虑以下 HTML:
<button ng-hide="hideButton()" confirm="Are you sure?" confirm-action="doIt()">Do It</button>
在这个简单的示例中,我想显示一个 JavaScript 确认对话框,并且只有在他们在确认对话框中单击“确定”时才调用 doIt()。使用隔离范围很简单。该指令如下所示:
.directive('confirm', function () {
return {
restrict: 'A',
scope: {
confirm: '@',
confirmAction: '&'
},
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (confirm(scope.confirm)) {
scope.confirmAction();
}
});
}
};
})
但问题是,因为我使用的是隔离作用域,所以上面示例中的 ng-hide 不再针对父作用域执行,而是在隔离作用域中执行(因为在任何指令上使用隔离作用域都会导致该元素上的所有指令使用隔离范围)。这是上述示例的 jsFiddle,其中 ng-hide 不起作用。(请注意,在这个小提琴中,当您在输入框中键入“yes”时,按钮应该隐藏。)
另一种选择是不使用隔离范围,这实际上是我在这里真正想要的,因为不需要隔离该指令的范围。我唯一的问题是,如果我不在隔离范围上传递它,我如何调用父范围上的方法?
这是一个 jsfiddle,我没有使用隔离作用域并且 ng-hide 工作正常,但是,对 confirmAction() 的调用当然不起作用,我不知道如何使它工作。
请注意,我真正要寻找的答案是如何在不使用隔离作用域的情况下调用外部作用域上的函数。而且我对让这个确认对话框以另一种方式工作不感兴趣,因为这个问题的重点是弄清楚如何调用外部范围,并且仍然能够让其他指令针对父范围工作。
或者,如果其他指令仍然适用于父范围,我很想听听使用隔离范围的解决方案,但我认为这是不可能的。