2017-05-11 4 views
1

私はリストをレンダリングするために次のコードを使用しています:Vuejs - イベントの代表団とvのコンテキスト参照

<div @click.prevent="myhandler($event)"><!-- Delegated event handler--> 
    <div class="tasks" v-for="(task, subName) in step.tasks"> 
     <button type="button"> 
      {{ task.caption }} 
     </button> 
     <span> {{ task.callableName }} </span> 
    </div> 
</div> 
methods: { 
    myhandler(e){ 
     // Event target may be a button element. 
     let target = e.target; 
     // … 
     // Let's assume we know 'target' is a button element instance. 
     // I wish I could have access to the v-for item ("task") which is associated in some ways to the button that was clicked. 
     // let the_task_reference = ?; 
    }… 

私はそこにきれいな方法を私はv-forスコープ特定のタスクを達することができるようにそのボタンに関連していますか?
ありがとうございます。

答えて

1

代わりに、タスクのインデックスをボタンに保存することもできます。

<div class="tasks" v-for="(task, index) in step.tasks"> 
    <button type="button" :data-index="index"> 
     {{ task.caption }} 
    </button> 
    <span> {{ task.callableName }} </span> 
</div> 

あなたのハンドラでは、インデックスを使用してタスクを取得します。

myhandler(evt){ 
    const task = this.step.tasks[evt.target.dataset.index] 
    ... 
} 

Example

idのような強力なものをお持ちでしたら、それはさらに優れています。

VUEとコンポーネントのルート要素に追加された隠し財産、__vue__があり推奨されていません。コンポーネントを反復処理していたら、何かを行うことができるでしょうlike in this example

バージョン間で変更が可能なVue内部構造に大きく依存しているので、このアプローチはお勧めできませんが、今日はそこにあります。

+0

それは私が考えたことです。私はおそらく他のきちんとした選択肢がないように思われるので、おそらくそれに行くでしょう。多分もう一日質問を生き返らせ、あなたの答えを解決策として考えてみましょう。ありがとうございました。 – Stphane

0

最もストレートフォワードソリューションはv-forディレクティブと同じdivにイベントハンドラを入れて、ちょうどtask変数に渡すことになります:あなたが本当に使用する必要がある場合

<div 
    class="tasks" 
    v-for="(task, subName) in step.tasks" 
    @click.prevent="myhandler(task, $event)" 
> 
    <button type="button">{{ task.caption }}</button> 
    <span>{{ task.callableName }}</span> 
</div> 

親ハンドラのイベントハンドラを使用する場合は、コンポーネントプロパティを使用してクリックしたタスクを追跡し、v-forディレクティブを使用してdivに追加のクリックハンドラを追加することができます。

<div @click.prevent="myhandler($event)" 
    <div 
    class="tasks" 
    v-for="(task, subName) in step.tasks" 
    @click="clickedTask = task" 
    > 
    <button type="button">{{ task.caption }}</button> 
    <span>{{ task.callableName }}</span> 
    </div> 
</div> 

あなたはclickedTaskプロパティを追加する必要があります。

data() { 
    return { 
    clickedTask: null, 
    } 
} 

そしてハンドラにあなたがthis.clickedTask経由でタスクを参照することができます。

+0

ありがとうございますが、私はそれを知っています。私が言及したように、ここではイベントの委任を使う必要があります。言い換えれば、最初の共通の祖先がイベントを処理したいということです。つまり、イベントターゲットであるボタン要素にのみアクセスできるときにタスクオブジェクトを参照する方法が必要です。 – Stphane

+0

@Stphane 'task'変数にスコープ外のイベントから直接アクセスする方法はありません。追加の参照を設定する必要があります。私の更新を参照してください – thanksd

+0

私は、vueインスタンス上のいくつかの隠れたプロパティが役立つと思ったが、そのようなものは存在しないようだ。あなたの最終的な解決策があまりにも多くのオーバーヘッドにつながるのではないかと心配しますまず、クリックハンドラが各v-for div要素(最初は避けたい)に登録されているため、第2に新しいプロキシデータが必要になります。私は掘り下げて、私が最後に何をしたのかを知らせます。再びありがとう。 – Stphane