Javascript 访问指令';s将范围从转包内容中隔离出来

Javascript 访问指令';s将范围从转包内容中隔离出来,javascript,html,angularjs,angularjs-directive,angularjs-scope,Javascript,Html,Angularjs,Angularjs Directive,Angularjs Scope,我不确定这是否真的是可能的,但我本质上希望AngularJS中的隔离作用域与“&”相反。下面是一个示例 基本上,我有一个自定义指令设置,它提供一些可重用的HTML。它利用ng transclude允许在其中呈现一些外部内容。但是,我发现有一种情况,我希望从代码的转置部分访问在指令的隔离范围上设置的函数 所以本质上我有一些东西看起来像: <div ng-controller="MainController"> <!-- The directive -->

我不确定这是否真的是可能的,但我本质上希望AngularJS中的隔离作用域与“&”相反。下面是一个示例

基本上,我有一个自定义指令设置,它提供一些可重用的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的回答,可以使用
$scope
上的
$$previsibling
从转置内容中访问指令的隔离范围。但是,我已经更新了上面的Plunkr,尝试从
ng repeat
指令中执行此操作,但该指令不起作用。我假设重复中的项目不会继承范围。

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

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


参见此

尽管可能,但我提出的解决方案是一种破解,因为它使用了一个范围内部变量,
$$previsibling

在您的转置内容中,您处于转置范围内。指令的隔离和转移作用域是同级的。要从转移范围到隔离范围,可以使用
$$previsibling
。(要从隔离范围到转移范围,可以使用
$$nextSibling

所以,这项技术会奏效:

<a href="" ng-click="$$prevSibling.action()">Invoke the Directive Action</a>
然后在你的指令中:

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

Angular v1.3+的更新

从Angular v1.3开始,被转移的作用域现在是该指令的隔离作用域的子级–它们不再是同级。因此,要从转移范围到隔离范围,请使用
$parent

使用ng repeat,每个项仍会创建转置范围的子范围:

但是为了从ng repeat子作用域中获得在隔离作用域上定义的方法
action()
,我们现在使用

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


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

干杯,这很有效。但是,我发现它在
ng repeat
(我假设,因为每个项目都没有从控制器继承
$$scope
。是否每个项目都可以访问
$$previsibling
?我已经更新了上面的Plunkr以给出一个示例。非常棒,非常有魅力!感谢这个图表,非常有用。您知道是否可以为t定义一个有意义的名称吗查看代码中的链是
$parent
,类似于
ng let=“isolateScope=$parent.$parent”
<div ng-repeat="item in items" ng-click="$parent.$$prevSibling.action()">
<div ng-repeat="item in items" ng-click="$parent.$parent.action()">