2017-10-28 6 views
0

私は角度ベースのアプリケーション(現在v4.4)を持っています。私は、コンポーネントが有限の回数だけ自分自身のインスタンスを表示し、次に最も低い「子」コンポーネントに、svgがあるビューを持っています。親コンポーネントのクリックイベントを発生せずに子コンポーネントをクリック

(click)イベントを使用してクリックされた最小のコンポーネントを取り込めます。後続の各子コンポーネントが親の上に表示されるように、Z-インデックスを反復番号にリンクするように設定できると思ったので、その領域のどこかをクリックすると、正しいイベントが発生します。

私はこれを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ソリューションを試しましたか?子のイベントトリガだけを必要とする場合、parentの 'pointer-events'は' none'になります。 –

+0

@EmadEmami私は最終的に、クリックしたコンポーネントの反復値を使用してナビゲーションに使用したいので、角度イベントを発生させたいです –

答えて

1

event.stopPropagation();子要素のクリックハンドラの上部にあります。これを他のイベントハンドラに追加する必要があるかもしれません。

また、あなたが試みることができるCSS:親の #parentElement { pointer-events: none; }、および子要素に .childElement { pointer-events: auto; }

それぞれのIDとクラス名を親と子にそれぞれ追加します。

+0

これをplunkで使用すると表示できますか? –

+0

答えは完全に良いわけではなく、代わりに私の答えをクリックアクションで$イベントのパラメーターで使用してください; – andrea06590

+0

stopPropagationを既存のクリックハンドラーに置くと、追加のハンドラーを作成する必要はありません。 – jdmayfield

2

あなたのプランナーで成功しました。あなたのcliked機能のトップにするevent.stopPropagation()を使用する必要がありますが、あなたはまた、このように、あなたのクリックアクションで$イベントを追加する必要があります:あなたが持っている必要がありますあなたのhtmlで

(click)=clicked($event) 
your.tsで

があなたのstopPropagationを追加します。

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

EDIT: あなたの最後の層のためのソリューション、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

ありがとう!それは問題のほとんどを解決するが、私はまだ子コンポーネント3(svgを含むコンポーネント)のクリックを登録していないsvgをクリックすることに直面している - これを参照してください[plunk](http://plnkr.co/edit/ uAJ2QOzM4rzYtBd5DoVX?p = preview) –

+0

はい、私はあなたが2つの可能性を持っていることを望むなら、svgをクリックできないことがわかります:ElementRefを使ってDOM要素にクリックリスナーを追加してから、 を使用するか、idを使用します。 もう1つの可能性は、オブジェクトの直前の絶対位置に300ピクセルx 300ピクセルのdivを追加することです:
<オブジェクト... 幸運;) – andrea06590

関連する問題