Javascript 访问指令';s将范围从转包内容中隔离出来
我不确定这是否真的是可能的,但我本质上希望AngularJS中的隔离作用域与“&”相反。下面是一个示例 基本上,我有一个自定义指令设置,它提供一些可重用的HTML。它利用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 -->
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()">