2017-08-05 29 views
4

我得到了新的实现要求,所以我必须根据条件呈现指令。

<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'

Todo,我从<filter-dir>发射事件,并捕获widget-dir不起作用的事件。

如果我删除ng - 如果它工作正常。

下面的事情我从各种渠道了解:

  • NG-如果在创建新的范围。 但是根据角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

回答

0

选项1: 可能其并没有在DOM中,当你发出it.Try NG秀,如果你能。

选项2:

$广播而不是$发出 在你的控制器做。

$ rootScope $广播( 'PHOTO_UPLOADED',照片);

,并在你的指令,通过

$ rootScope赶上广播事件。$对( 'PHOTO_UPLOADED',功能(事件,数据){ 缩略图=数据; });

+0

@选项1:如果我把NG-显示它会工作,因为它不会从大教堂,其中n,如果这样做,并创建新的范围中删除。 –

+0

DOM元素是存在的,我已经验证 –

+0

选项2:如果我要广播的事件我不得不事件发出母公司和父母的孩子有播出。 –