16

我不确定这是否真的可行,但我本质上想要一个反向的 AngularJS 中的“&”隔离范围。这是一个Plunkr来演示。

基本上,我设置了一个自定义指令来提供一些可重用的 HTML。它ng-transclude用于允许在其中呈现一些外部内容。但是,我发现了一种情况,我想从代码的嵌入部分访问已在指令的隔离范围上设置的函数。

所以基本上我有一些看起来像:

<div ng-controller="MainController">

    <!-- The directive -->
    <div some-custom-directive>

        <!-- Button 1 that invokes a method within the controller scope -->
        <button id="button1" ng-click="invoke1()">Invoke from Controller</button>

        <!-- Button 2 that invokes a method on the isolate scope for the custom directive -->
        <button id="button2" ng-click="invoke2()">Invoke from Isolate Scope</button>
    </div>
</div>

有谁知道这是否真的可能?

更新

根据@Mark Rajcok 的回答,在$$prevSibling上找到的$scope可用于从嵌入内容中访问指令的隔离范围。但是,我已经更新了上述 Plunkr 以从ng-repeat指令中尝试此操作,但该指令不起作用。我假设该重复中的项目不继承范围。

4

3 回答 3

22

虽然可能,但我提出的解决方案是一种 hack,因为它使用范围内部变量$$prevSibling.

在你被嵌入的内容中,你在被嵌入的范围内。该指令的隔离和嵌入范围是同级的。要从嵌入范围到隔离范围,您可以使用$$prevSibling. (要从隔离范围到转入范围,您可以使用$$nextSibling。)

所以,这个黑客将起作用:

<a href="" ng-click="$$prevSibling.action()">Invoke the Directive Action</a>

要在控制器范围内调用方法,您需要指定 using &as @ganaraj 已经演示过:

<content-presenter controller-action="action()">

然后在你的指令中:

scope: { controllerAction: '&' },
template: ... +
   '<button ng-click="controllerAction()">Trigger Ctrl action()</button>' ...

普朗克


使用 ng-repeat(请参阅 Samuel 的评论),每个项目都会创建嵌入范围的子范围。在下图中,我只展示了一个item以保持图片更小。反转 $$prevSibling 的 $$nextSibling 棕色箭头。

在此处输入图像描述

action()因此,从 ng-repeat 子范围获取在隔离范围上定义的方法的技巧是

<div ng-repeat="item in items" ng-click="$parent.$$prevSibling.action()">

Angular v1.3+ 的更新

从 Angular v1.3 开始,transcluded 作用域现在是指令的isolate 作用域的子对象——它们不再是兄弟。因此,要从嵌入范围到隔离范围,请使用$parent.

使用 ng-repeat,每个项目仍然创建嵌入范围的子范围:

在此处输入图像描述

但是action()要从 ng-repeat 子范围获取在隔离范围上定义的方法,我们现在使用

<div ng-repeat="item in items" ng-click="$parent.$parent.action()">
于 2013-04-23T15:11:24.443 回答
1

我的理解是添加ng-repeat到一个元素会创建一个新的范围,以便正确绑定重复的内容。您可能需要$parent在该链中添加一个附加项,例如$parent.$$nextSibling,以便升级到与指令的隔离范围相邻的级别。

于 2013-07-02T14:37:22.777 回答
1

这是一个解决您当前问题的解决方案。我不确定您要做什么。但据我所知,没有办法从外部范围调用隔离范围内的东西。当然,您可以在隔离作用域和外部作用域之间设置双向绑定变量,更改外部作用域中的变量并在隔离作用域上 $watch (这将像事件机制一样工作)......这是一个做你想做的事情的方式..如果你坚持的话。

或者,有一种机制可以从隔离作用域调用外部作用域上的函数。它有点像回调。

看到这个http://plnkr.co/edit/5MT4vo9qXtV6nQikfEiH?p=preview

于 2013-04-23T14:50:18.393 回答