angularjs – $emit事件不能与ng-if一起使用

前端之家收集整理的这篇文章主要介绍了angularjs – $emit事件不能与ng-if一起使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有新的实现要求,所以我必须根据条件渲染指令.

<div ng-app="myApp">

  <body-dir>

    <icon-dir> 
    </icon-dir>

    <filter-dir>
     </filter-dir>

    <widget-dir ng-if="someCondition">
    </widget-dir>

  </body-dir>
</div>

从上面的指令结构,我试图基于someCondition属性渲染’widget-dir’.

我正在从< filter-dir>发出事件的Todo并在widget-dir中捕获不起作用的事件.

如果我删除ng – 如果它工作正常.

以下我从各种来源了解的事情:

> ng-if创建新范围.
但根据角度doc,新创建的范围将从父级继承.

那么,它应该共享body-dir范围?
如果它是共享的,那么无论我们从< filter-dir>发出事件,应该捕获widget-dir?

以上功能正常工作如果我删除ng-if.
在这里,我无法理解究竟发生了什么.

我知道$emit事件的目的是捕获父级中的事件.
之前我在一个兄弟姐妹中捕获了这个事件,因为它是从父范围共享的(这是最佳实践吗?).

更新:这里还有一件事我注意到如果我把ng-if放在指令子元素(不是指令)上,那么它就按预期工作了.
在下面的代码中,我将ng-if放在模板元素上.
在这里,我正在尝试理解角度范围如何与ng-if一起使用.

angular.module('app').directive('widgetDir',function(){
  return {
    template: '<br><span ng-if="true">I\'m in "ng-if"</span>',link: function(scope,element,attrs){
  scope.$on('evt-filter',function(evt,data){
    alert(data);
  });
    }
  }
})

任何人都可以清楚这一点.

问题可重现here

解决方法

选项1:
当你发出它时,可能是它在DOM中的NOT.如果可以的话,试试ng-show.

选项2:

$broadcast而不是$emit
在您的控制器中执行:

$rootScope.$broadcast(‘PHOTO_UPLOADED’,photo);

并在您的指令中,通过获取广播事件

$rootScope.$on(‘PHOTO_UPLOADED’,function(event,data) { thumbnail = data; });

猜你在找的Angularjs相关文章