我正在尝试链接两个使用隔离范围的嵌套指令。
<div ng-controller="myController">
<my-dir on-done="done()">
<my-dir2 on-done="done()">
</my-dir2>
</my-dir>
</div>
我希望第二个指令(my-dir2)调用第一个指令(my-dir)的done()函数,然后调用控制器一个。
不幸的是我不知道如何使第二个指令访问第一个指令的回调(到目前为止,第二个指令正在查看高级控制器,绕过第一个指令)。
我认为可以使用“require”,但我不能,因为这两个指令没有关系(我想在其他指令中使用my-dir2而不仅仅是my-dir)。
说清楚:我不想使用require,因为这意味着myDir会依赖于myDir2。我的观点是:我希望能够在其他指令中重用myDir2。所以我不希望myDir2基于myDir,但我确实想要在完成某些事情时通知上层指令(myDir)(比如在js中的回调中)。
我已经制作了一个plunker:正如您在javascript控制台中看到的那样,my-dir2直接从高级控制器调用done函数。
有没有人有干净的方法来应对这种情况?
由于
答案 0 :(得分:0)
<强>更新强>
能够编写彼此独立的指令,您需要使用事件:
$emit('myEvent', 'myData')
触发将由层次结构中向上的范围处理的事件。$broadcast('myEvent', 'myData')
触发将由层次结构中向下的范围处理的事件。$emit
或$broadcast
使用$on('myEvent', function(event, data){\\your code})
PS:在你的情况下,$emit
将不起作用,因为两个指令范围在层次结构中处于同一级别,因此您需要使用$rootScope.$broadcast('myEvent' \*, myData*\);
我已更新我的plunker以反映需要更改http://plnkr.co/edit/eTkO6sk6hpuYPnCjlSKn?p=info
以下内容将使内部指令依赖于外部指令:
基本上能够在第一个指令中调用一个你需要做一些改变的函数:
require = '^myDir'
添加到myDir2
onDone
移除myDir2
并保留隔离范围
scope:{}
myDir2
link:
function(scope,element,attrs,controller)
myDir1
控制器中更改done
函数的定义
从$scope.done
到this.done
controller.done()
myDir2
醇>
的plunker
答案 1 :(得分:0)
我认为你可以这样做: angular.element(&#39;我的-DIR&#39;)控制器。(&#39; MYDIR&#39)。()完成;
试一试!