Javascript ng是否阻止Angular.js中的事件传播?
当我试图通过$scope对象将事件从指令发送到嵌套指令时,就会出现问题。例如,Javascript ng是否阻止Angular.js中的事件传播?,javascript,angularjs,events,angularjs-directive,transclusion,Javascript,Angularjs,Events,Angularjs Directive,Transclusion,当我试图通过$scope对象将事件从指令发送到嵌套指令时,就会出现问题。例如,$scope.broadcast('event')子指令不接收事件,但当我使用$rootScope对象时,它会工作,例如,$rootScope.broadcast('event') TL;DR:为什么不起作用:什么时候起作用: 编辑:在angular.js 1.3.0及以上版本中,这不再是问题这是因为您给了指令隔离范围。如果希望指令中的scope参数与父元素具有嵌套作用域,请将其从指令中删除。或者,您可以在范围上定义父
$scope.broadcast('event')
子指令不接收事件,但当我使用$rootScope对象时,它会工作,例如,$rootScope.broadcast('event')
TL;DR:为什么不起作用:什么时候起作用:
编辑:在angular.js 1.3.0及以上版本中,这不再是问题这是因为您给了指令隔离范围。如果希望指令中的scope参数与父元素具有嵌套作用域,请将其从指令中删除。或者,您可以在范围上定义父范围中要传递到指令范围的属性和值
这是因为你给了指令隔离范围。如果希望指令中的scope参数与父元素具有嵌套作用域,请将其从指令中删除。或者,您可以在范围上定义父范围中要传递到指令范围的属性和值
如果
FirstCtrl
的作用域是SecondCtrl
作用域的父级,则应在FirstCtrl
中使用$broadcast方法:
'use strict';
angular.module('myAppControllers', [])
.controller('FirstCtrl', function ($scope) {
$scope.$broadcast('UPDATE_CHILD');
})
.controller('SecondCtrl', function ($scope) {
$scope.$on('UPDATE_CHILD', function() {
// do something useful here;
});
});
如果作用域之间没有父/子关系,则应将$rootScope注入FirstCtrl,并将事件广播到其他控制器(包括SecondCtrl)及其相应的(在本例中为子控制器)$scope:
'use strict';
angular.module('myAppControllers', [])
.controller('FirstCtrl', function ($rootScope) {
$rootScope.$broadcast('UPDATE_ALL');
});
如果
FirstCtrl
的作用域是SecondCtrl
作用域的父级,则应在FirstCtrl
中使用$broadcast方法:
'use strict';
angular.module('myAppControllers', [])
.controller('FirstCtrl', function ($scope) {
$scope.$broadcast('UPDATE_CHILD');
})
.controller('SecondCtrl', function ($scope) {
$scope.$on('UPDATE_CHILD', function() {
// do something useful here;
});
});
如果作用域之间没有父/子关系,则应将$rootScope注入FirstCtrl,并将事件广播到其他控制器(包括SecondCtrl)及其相应的(在本例中为子控制器)$scope:
'use strict';
angular.module('myAppControllers', [])
.controller('FirstCtrl', function ($rootScope) {
$rootScope.$broadcast('UPDATE_ALL');
});
您的指令使用了ng transclude
。从文档中:
在典型的设置中,小部件创建一个隔离作用域,但转换不是子级,而是隔离作用域的同级
这就是您的范围层次结构的外观:
- 003是指令
one
- 004是
两个
元素所在的转换范围
- 005是第一条指令的范围
two
- 006是第一条指令
two
two
的作用域不是one
的子作用域,您的指令使用了ng transclude
。从文档中:
在典型的设置中,小部件创建一个隔离作用域,但转换不是子级,而是隔离作用域的同级
这就是您的范围层次结构的外观:
- 003是指令
one
- 004是
两个
元素所在的转换范围
- 005是第一条指令的范围
two
- 006是第一条指令
two
two
的范围不是one
的子范围
转换创建一个“隔离”作用域,但转换不是一个
子级,但为“孤立”范围的兄弟
(来自源代码)
没有父子关系。因此,$broadcast、$emit不起作用,因为$broadcast需要子项,$emit需要您认为是兄弟的父项
对于这个问题,这里有很多很好的解释,这些解释可能鼓励您重新思考控制器的组织方式,以及如何使用ng transclude。如果您需要另一个解决方案,我编写了一个微小的指令来解决两个指令之间的交互,以创建父子层次结构。使用风险自负,我希望这会有所帮助!:)
转换创建一个“隔离”作用域,但转换不是一个
子级,但为“孤立”范围的兄弟
(来自源代码)
没有父子关系。因此,$broadcast、$emit不起作用,因为$broadcast需要子项,$emit需要您认为是兄弟的父项
对于这个问题,这里有很多很好的解释,这些解释可能鼓励您重新思考控制器的组织方式,以及如何使用ng transclude。如果您需要另一个解决方案,我编写了一个微小的指令来解决两个指令之间的交互,以创建父子层次结构。使用风险自负,我希望这会有所帮助!:)
但只有父作用域具有独立作用域。子范围设置为
true
。而且不要认为可以在子范围中显式定义事件。(请注意:您链接到的plnkr似乎也不起作用,当我单击按钮时什么也没有发生)立即尝试,忘记保存它。这种方法的问题是,通过删除scope参数,您将其隐式设置为false,这反过来意味着指令没有作用域。这意味着您所做的一切都发生在最外层的范围内(本例中为rootScope)。这意味着页面上不能有多个指令:但只有父作用域具有独立的作用域。子范围设置为true
。而且不要认为可以在子范围中显式定义事件。(请注意:您链接到的plnkr似乎也不起作用,当我单击按钮时什么也没有发生)立即尝试,忘记保存它。这种方法的问题是,通过删除scope参数,您将其隐式设置为false,这反过来意味着指令没有作用域。这意味着你所做的一切都发生在最外层的范围内(ro)