2017-06-15 19 views
1

Vue.jsでメソッドを起動した要素への参照を取得するにはどうすればよいですか? このようなHTML私がしている:Vue.jsのメソッドの要素への参照を取得する

<input type="text" v-model="dataField" v-bind:class="dataFieldClass" /> 

そして、私のVue.jsでは、私はこの方法持っているのViewModel:

dataFieldClass: function() { 
    // Here I need the element and get its ID 
    // Pseudo code 
    var elementId = $element.id; 
} 

を、私はそれがイベント(V-onから要素を取得することは可能だということを知っている:クリックしてください)、これはイベントではなく、viewmodelのいくつかの条件に従って要素のCSSクラスを返す単純なメソッドです。それも計算可能であるべきですが、問題は同じです。

+0

'dataFieldClass'方法は、それがプロパティにバインドする際に使用したものを要素見当がつかないでしょう。なぜ要素を参照したいのですか?ユースケースは何ですか? – thanksd

+0

私はこれを使って、表示する対応するCSSを見つけ出します。同様のシナリオで、要素を有効または無効にするかどうかを判断します(多くの入力が無効な場合は他のコントロールを無効にします)。 要素を有効にするかどうかを決定する3-4の条件があります.1行の条件文をHTMLバインディングに入れたくないので、メソッド内の機能をカプセル化したかったのです。 そして、要素名でエラーを自動的に収集するvee-validateを使用しています。決定プロセスでVeeValidate $ errorsコレクションを使用しています。 –

+0

しかし、これらの条件はhtml要素に基づいていますか?または 'dataField'オブジェクトですか? – thanksd

答えて

-1

あなたは、単にあなたが

dataFieldClass (reference) { 
    var elementId = reference 
} 
+0

私はパラメータを渡すことができます。しかし、それは私が必要なものではありません。 要素への参照を渡すにはどうすればよいですか?あるいはその属性の1つだけかもしれませんか?もちろん、ハードコードされた文字列ではありません。 –

+0

パラメータはハードコードされた文字列である必要はありません。 –

+0

私たちは皆、パラメータを渡す方法を知っています。彼はDOM要素を望んでいる。おそらく彼はそのデータから*の属性を得ることができました。 – Grandizer

2

たぶん、あなたはrefを使用することができ、それをキャッチすることができ、あなたの方法

<input type="text" v-model="dataField" v-bind:class="dataFieldClass(1) /> 

に引数を渡すことができますか?このような

<input type="text" v-model="dataField" v-bind:class="dataFieldClass" ref="el" /> 

そして、それを使用します。ここ

dataFieldClass: function() { 
    var elementId = this.$refs.el; 
} 

参照ドキュメント:https://vuejs.org/v2/api/#ref

+0

さて、dataFieldClassメソッドは、HTMLの多くの入力から呼び出されます。そして私は彼らのうちのどれが電話したか知る必要があります。その後、その名前(またはID)を取得していくつかのテストを行い、適切なクラスを返します。 –

+0

あなたは ''を実行できますか?次に、 'dataFieldClass'を計算されたプロパティの代わりにメソッドにします。 –

+0

はい、できます。実際には私が今使っている回避策ですが、関数内で呼び出し要素を取得するためのもっとエレガントな方法があるかどうかを知りたかったのです。 jQueryにはもう1つのJSフレームワークKnockout.jsがありますので、Vue.jsにもそれがあると思います。 idを持つ文字列をハードコードしないで、$ attribute(id)のようなものを動的に渡す方法であれば、これで十分です。 –

0

ref patternの使用に関する。 ref="someName"をDOM要素に置き、メソッド内でthis.$refs["someName"]を使用してアクセスします(メソッドにパラメータとして'someName'を渡すことができます)。

何らかの理由で本当にDOM要素が必要な場合を除いて、これはあまり良いパターンではありません。それ以外の場合は、関連するパラメータをメソッドに渡します。

主に欠点があるため、良い方法ではありません。最初にvueがレンダリングされたとき(要素がまだ存在しないため)、$ refsはありません。したがって、vueを強制的に2回レンダリングする必要があります。

v-forループ内に複数の要素がある場合、これは$ refs ["someName"]は配列になります。あなたは、それはいくつかの適応で動作するように取得することができ、ここでの例です:

new Vue({ 
 
    el: '#app', 
 
    data() { 
 
    return { 
 
     fields: [{ 
 
      name: 'field1', 
 
      value: 'value1' 
 
     }, 
 
     { 
 
      name: 'field2', 
 
      value: 'value2' 
 
     } 
 
     ] 
 
    }; 
 
    }, 
 
    methods: { 
 
    dataFieldClass(index) { 
 
     if (!this.$refs.fields) { 
 
     // First render, the element is not there yet 
 
     return ''; 
 
     } else { 
 
     // Here is the element 
 
     console.log(this.$refs.fields[index]); 
 
     } 
 
    } 
 
    }, 
 
    mounted() { 
 
    // Force the instance to render a second time 
 
    this.$forceUpdate(); 
 
    } 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script> 
 

 
<div id="app"> 
 
    <label v-for="(field, index) in fields"> 
 
    {{ field.name }}: 
 
    <input ref="fields" :value="field.value" v-bind:class="dataFieldClass(index)"> 
 
    </label> 
 
</div>

関連する問題