从AngularJS中没有隔离范围的指令调用控制器函数

前端之家收集整理的这篇文章主要介绍了从AngularJS中没有隔离范围的指令调用控制器函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我似乎找不到一个方法调用父范围从一个指令内的函数,而不使用隔离范围。我知道如果我使用孤立的范围,我可以只使用“&在孤立的情况下访问父作用域上的函数,但是使用孤立作用域时不需要有后果。考虑下面的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不再对父范围执行,而是在隔离范围中执行(因为在任何指令上使用隔离范围会导致该元素上的所有指令使用隔离范围)。 Here is a jsFiddle上面的例子中ng-hide不工作。 (请注意,在这个小提琴中,当您在输入框中键入“yes”时,按钮应该会隐藏。)

替代方法是不使用隔离的范围,这实际上是我真正想要的,因为没有必要隔离这个指令的范围。我唯一的问题是,如果我不在隔离范围上传递它,我如何调用父范围上的方法

Here is a jsfiddle我不使用隔离的范围和ng-hide工作正常,但是,当然,调用confirmAction()不工作,我不知道如何使它的工作。

请注意,我真正寻找的答案是如何调用外部范围上的函数,而不使用隔离范围。我不想让这个确认对话框工作在另一种方式,因为这个问题的要点是弄清楚如何调用外部范围,仍然能够有其他指令工作对父范围。

或者,我有兴趣听到解决方案使用孤立的范围,如果其他指令仍然对父范围工作,但我不认为这是可能的。

因为指令只是调用一个函数(而不是试图在属性上设置一个值),你可以使用 $eval而不是$ parse(与非隔离范围):
scope.$apply(function() {
    scope.$eval(attrs.confirmAction);
});

或者更好,只是使用$apply,它将$ eval()uate其范围的参数:

scope.$apply(attrs.confirmAction);

Fiddle

猜你在找的Angularjs相关文章