2017-10-28 144 views
0

我有一个基于角度的应用程序(当前版本为v4.4)。我有一个视图,一个组件在有限次数的情况下显示它自己的一个实例,然后在最低的“子”组件中有一个svg。点击没有触发父组件的点击事件父组件上的点击事件

我希望能够拾取使用(click)事件点击过的最低组件。我认为我可以设置z-index链接到迭代编号,以便每个后续的子组件都出现在父节点的顶部,因此当单击该区域中的任何位置时,就会触发正确的事件。

我在plunkr上做了这个demo。你会看到点击svg不会触发点击事件,但点击框内的任何其他区域,会导致该框的点击事件以及它的所有父母。

我希望能够独立地切换所有框的背景颜色。

这里是我的部件有:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
     <my-child [iteration]="0"></my-child> 
    </div> 
    `, 
}) 
export class App { 
    name:string; 
    constructor() { 
    this.name = `Angular! v${VERSION.full}` 
    } 
} 

@Component({ 
    selector: 'my-child', 
    template: ` 
    <div class="border" [style.background]="toggle ? 'green' : 'pink'" (click)="clicked()"> 
    {{iteration}} 
     <my-child [iteration]="iteration" *ngIf="iteration < 3"></my-child> 
     <object *ngIf="iteration == 3" 
     id="img" width="300" height="300" 
     data="http://snapsvg.io/assets/images/logo.svg"></object> 
    </div> 
    `, 
}) 
export class Child { 
    name:string; 
    @Input() iteration; 
    toggle: boolean; 
    constructor() { 
    this.name = `Angular! v${VERSION.full}` 
    this.toggle = false; 
    } 
    ngOnInit() { 
    ++this.iteration; 
    } 
    clicked(){ 
    this.toggle = !this.toggle; 
    console.log(this.iteration) 
    } 
} 

UPDATE:

目前的答案回答这个问题的第一部分,但不与SVG点击不触发点击事件处理显示svg的组件。

+0

您是否试过css解决方案?当您只需要子事件触发器时,父项的“指针事件”可以是“无”。 –

+0

@EmadEmami我想发起一个角度事件,因为我最终想要使用点击组件的迭代值来导航 –

回答

1

event.stopPropagation();位于子元素的点击处理程序的顶部。您可能需要将其添加到其他事件处理程序中以用于mousedup/down等。

你也可以尝试的CSS: #parentElement { pointer-events: none; }父,并 .childElement { pointer-events: auto; }的子元素;

并分别将ID和类名添加到父项和子项。

+0

您能否展示这个与plunk一起工作? –

+0

答案并不完全好,用我的答案,而不是在你的点击动作中使用$ event params;) – andrea06590

+0

如果你把stopPropagation放在现有的点击处理程序中,你不需要创建一个额外的处理程序.. – jdmayfield

2

我成功地在你的抢劫者身上做到了。你必须在你cliked函数的顶部使用event.stopPropagation(),但你也必须加上$事件在点击动作,就像这样:

在你的HTML

你必须有

(click)=clicked($event) 

在your.ts添加stopPropagation:

clicked(event) { 
    event.stopPropagation(); 
} 

编辑: 你的最后一层的解决方案,使用的SVG元素之上的无形的div,你可能需要去适应的样式和位置。

<div style="width:300px; height:300px; position:absolute; z-index:1000"> 
</div> 
<object *ngIf="iteration == 3" 
     id="img" width="300" height="300" 
     data="http://snapsvg.io/assets/images/logo.svg"> 
</object> 
+0

谢谢!这解决了大部分问题,但我仍然需要点击svg而不是注册点击子组件3(包含svg的组件) - 请参阅[plunk](http://plnkr.co/edit/) uAJ2QOzM4rzYtBd5DoVX?p = preview) –

+0

是的,我可以看到你不能点击svg,如果你想这样做你有两个可能:使用ElementRef在你的DOM元素上添加一个点击监听器,然后得到你的svg元素使用或使用id。 另一种可能性是在对象之前的绝对位置添加一个300px x 300px div:
andrea06590