angularjs – 嵌套指令之间的通信
我正在尝试在父指令和它的嵌套子指令之间进行通信,反之亦然.我已经设法通过使用$broadcast和$emit来实现这一点,但是因为我在指令中传递了一些参数,我必须在我的指令上创建隔离范围,所以为了$broadcast / $emit来我必须在父作用域(范围.$parent.$broadcast)上播放’up a level’.
现在,广播不再仅仅是针对嵌套子节点,而是针对同级别的所有指令,这是我不想要的.我已经创建了一个用于显示问题的plunker,here. 我需要的是当按下其中一个按钮时,只有child指令接收广播消息,反之亦然.我错过了什么,或者在使用隔离范围时这是不可能的? 在我的HTML中: <body ng-app="myApp"> <directive1 data-title="Click me to change name"> <directive2 data-name="John Smith"></directive2> </directive1> <directive1 data-title="Click me to change this other name"> <directive2 data-name="Gordon Freeman"></directive2> </directive1> </body> 指令1: <div> <button ng-click="changeName()">{{title}}</button> <div ng-transclude></div> </div> 指令2: <div> <h2>{{name}}</h2> </div> 我的指示: myApp.directive('directive1',function(){ return { restrict: 'E',replace: true,templateUrl: 'Directive1.html',transclude: true,scope: { title: '@' },link: function(scope,elem){ scope.changeName = function() { scope.$parent.$broadcast('ChangeName'); }; scope.$parent.$on('NameChanged',function(event,args){ scope.title = 'Name changed to ' + args; }); } } }); myApp.directive('directive2',templateUrl: 'Directive2.html',scope: { name: '@' },elem){ scope.$on('ChangeName',args){ scope.name = 'Adam West'; scope.$emit('NameChanged','Adam West'); }); } } });
指令之间有5种主要的通信方式:
1)共同的服务. 这对您来说不是一个好的解决方案,因为服务总是单例,并且您希望拥有多个唯一的指令.如果您在服务中维护父母和子女的字典并且管理路由调用右侧关联的父/子,您只能使用服务,这与您使用事件的问题相同. 2)事件. 如果您不能通过从右侧节点广播将事件限制到DOM /树的正确部分,则必须为事件添加唯一标识符.在这种情况下,如果您正在从根广播和/或多个孩子正在接收消息,请为每个父/子提供唯一标识符并将其添加到emit / broadcast / on.这不是一个漂亮的解决方案,但它会起作用. 3)单向绑定. ‘&’在隔离范围内绑定允许您将父函数传递给子级.然后,子进程可以在父作用域上调用这些函数,以通知父进程发生更改.这对于孩子 – 父母的沟通非常有用,但不会反过来.您可以将此解决方案与来自父级的广播事件相结合,以便与孩子进行沟通. 4)双向绑定. 有时,您可以使用隔离范围上的属性来传递信息或标志,以及父子之间.这在你的例子中不起作用,因为父母对他的孩子一无所知,因为孩子是通过翻译注射的. 5)要求父控制器. 指令可以使用require属性指定另一个指令作为父元素或同一元素存在.你不能要求兄弟指令.必需的指令必须定义控制器.然后将控制器传递给链接(或编译)功能,您可以在控制器上调用函数.这可用于允许指令之间的通信.在您的示例中,如果directive2需要directive1,您可以将addChild()等函数设置到控制器.然后,子(directive2)将自己添加到可以在调用changeName时更新/调用所有子项的父项. myApp.directive('directive1',function(){ return { // ... controller: function($scope) { $scope.children = []; this.addChild = function(child) { $scope.children.push(child); } },elem){ scope.changeName = function() { _.each(scope.children,function(child) { child.setName('Adam West'); }; }; },} }); myApp.directive('directive2',function(){ return { // ... require: "^directive1",// require directive1 as a parent or on same element link: function(scope,elem,attributes,directive1Controller){ child = { setName: function(name) { scope.name = name; },}; directive1Controller.addChild(child); } } }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – Apache Spark – MlLib – 协同过滤
- FileNe使用Invoke节点调用WebService手册
- unix – 当输入以数字方式排序时,连接省略输出行
- 在Vim中导航跳转列表,其中Tab映射到别处
- indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
- 如何从angular-5中的url获取查询参数?
- Shell中函数的定义和使用
- WebService 之 WSDL文件 讲解
- angular.js:4411 Uncaught Error: [$injector:modulerr]
- 如何在Play 2.0(Scala)中使用DATABSE_URL进行PostgreSQL 9.