Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ng是否阻止Angular.js中的事件传播?_Javascript_Angularjs_Events_Angularjs Directive_Transclusion - Fatal编程技术网

Javascript ng是否阻止Angular.js中的事件传播?

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对象将事件从指令发送到嵌套指令时,就会出现问题。例如,
$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)