当前位置: 首页 > 面试题库 >

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

封德华
2023-03-14
问题内容

我似乎找不到不使用隔离范围从指令内调用父范围内的函数的方法。我知道,如果我使用隔离作用域,则可以在隔离作用域中使用“&”来访问父作用域上的函数,但是在不必要时使用隔离作用域会产生后果。考虑以下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不起作用。(请注意,在此小提琴中,当您在输入框中键入“是”时,按钮应该隐藏。)

另一种选择是 不要使用隔离范围 ,这实际上是我在这里真正想要的,因为不需要将此指令的范围隔离。我唯一的问题是,
如果不在隔离范围内传递方法,该如何在父范围内调用方法

这是一个我没有使用隔离范围的jsfiddle,而ng-
hide可以正常工作,但是,当然,对confirmAction()的调用不起作用,并且我不知道如何使它起作用。

请注意,我真正要寻找的答案是如何在不使用隔离范围的情况下在外部范围内调用函数。
而且我对使此确认对话框以另一种方式工作不感兴趣,因为这个问题的目的是弄清楚如何对外部作用域进行调用,并且仍然能够使其他指令在父作用域内起作用。

另外,如果其他指令仍然可以对父作用域起作用,那么我会很想听到使用隔离作用域的解决方案 ,但是我认为这是不可能的。


问题答案:

由于伪指令仅调用函数(而不是尝试在属性上设置值),因此可以使用$
eval
代替$
parse(具有非隔离范围):

scope.$apply(function() {
    scope.$eval(attrs.confirmAction);
});

或更好的是,只需使用$
apply,这将使$
eval()将其参数反对作用域:

scope.$apply(attrs.confirmAction);

小提琴



 类似资料:
  • 如果不使用隔离作用域,我似乎找不到从指令中调用父作用域上的函数的方法。我知道如果我使用隔离作用域,我可以使用“ 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且只有在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。指令如下所示: 但问题是,因为我使用的是隔离作用域,所以上面示例中的ng hide不再针对父作用域执行,而是在隔离作用域中执行(因为在任何指令上使用

  • 问题内容: 我首先尝试使用AngularJS自定义指令。 我在指令的链接功能中使用(或理解…)隔离范围时遇到麻烦。 这是我应用程序这部分的代码: view.html 是在viewCtrl范围内发布的变量,其中包含请求的xml字符串。 rawData.js raw-data.html 我不明白为什么弹出模式时会显示ID正确,但是当我尝试使用它时,其值是不确定的。 也许我对隔离的范围值(和)错了。 感

  • 问题内容: 我想编写带有隔离范围的指令,但也想使该范围可用于父范围的控制器。我找到了这个解决方案: 参见柱塞。 我觉得这有点丑陋,因为它涉及用HTML编写属性,而在控制器的代码中,您无法确定范围属性的来源。有一个更好的方法吗? 编辑: 此外,似乎在运行控制器“ Main”时$ scope.popup甚至不可用。指令的链接功能尚未执行? 问题答案: 为了保持适当的关注点分离,您不应该混合作用域。更不

  • 问题内容: 请在这里查看示例 角需要,,以在所述分离的范围对象从父范围访问它来限定。 在这里使用 那么,目的是什么?无法访问通过传递的所有属性。为什么不能将max的一个访问值代替 为什么要分配回来像? 由于此应用程序是由Angular作者编写的,因此我希望有一个理由。 谢谢。 问题答案: attrs的目的是什么? 在与指令相同的元素上定义的属性有几个用途: 它们是将信息传递到使用隔离范围的指令的唯

  • 那么,的目的是什么?不能访问通过传递的所有属性。为什么一个max的访问值不能作为而不是 为什么要像那样分配回来? 谢了。

  • 问题内容: 我想在没有自己的模板的AngularJS中创建可重用的指令。我也想为该指令设置隔离范围。我的方法的最佳做法是什么?为什么我的示例不符合我的预期? 我希望可以分别从指令中编辑obj1和obj2。 HTML: JS: PLUNKR:http://plnkr.co/edit/Dw8IiFVSOZGjSTFGRMzZ 问题答案: 您的代码现在的工作方式是,每个指令的内容都绑定到父作用域,而不是