2017-07-13 5 views
2

私はajaxコールを作成し、返された結果を使用してを使用してドロップダウンのオプションを生成したいと考えています。 私はこれを行うことができます。ajaxコールからVue.jsのドロップダウンを入力してください

<select v-model="selected"> 
    <option v-for="option in options" v-bind:value="option.value"> 
    {{ option.text }} 
    </option> 
</select> 
<span>Selected: {{ selected }}</span> 

の.jsは

new Vue({ 
    el: '...', 
    data: { 
    selected: 'A', 
    options: [ 
     { text: 'One', value: 'A' }, 
     { text: 'Two', value: 'B' }, 
     { text: 'Three', value: 'C' } 
    ] 
    } 
}) 

ファイルしかし、私は私のオプションは、ハードコーディングされたが、代わりにAJAX呼び出しから来ているしたくありません。

function pullEmployees(){ 
     var eventOwnerId = $('#eventOwner').val(); 
     var eventOwnerName = $('#eventOwner :selected').text(); 
     $.ajax({ 
      url: "employees.cfm", 
      data: { 
       eventOwnerId: eventOwnerId, 
       eventOwnerName: eventOwnerName, 
       method : "updateOwners" 
      }, 

      success: function(results) { 
       // results will have a list of objects where each objects has  two properties (ID and Value) 
      } 
    }); 
} 

私はで本当に新しいですし、誰かが助けることができる場合、私は感謝:

Ajax呼び出しは次のようになります。

+0

これまでのところどのような問題がありますか?あなたのコードで唯一現れる唯一の問題は、 'this'があなたの' success'コールバックでVueにならないことです。 – Bert

+0

私の問題は、vueオブジェクトのoptions属性にajax呼び出しの結果を添付する方法がわかりません。私の上記のサンプルでは、​​私はオプション(テキスト: 'One'、値: 'A'、テキスト: 'Two'、値: 'B'など)をハードコーディングしています。 – DoArNa

+0

オブジェクトがダウンした{id、value}と同じです。彼らは{text、value}である必要がありますか? – Bert

答えて

1

以下の例では、私はあなたのAJAX呼び出しをシミュレートしていますsetTimeoutである。基本的には、new Vue()の結果を変数に取り込み、そのVueのoptionsプロパティをajax呼び出しの結果で設定したいとします。

また、返すオプションが構造{ID, text}であることを反映するようにテンプレートを更新しました。

console.clear() 
 

 
let app = new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    selected: 'A', 
 
    options: [] 
 
    } 
 
}) 
 

 

 
function pullEmployees(){ 
 
    let options = [ 
 
    { text: 'One', ID: 'A' }, 
 
    { text: 'Two', ID: 'B' }, 
 
    { text: 'Three', ID: 'C' } 
 
    ]; 
 
    setTimeout(() => app.options = options, 1000) 
 
} 
 
pullEmployees()
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<div id="app"> 
 
    <select v-model="selected"> 
 
    <option v-for="option in options" v-bind:value="option.ID"> 
 
     {{ option.text }} 
 
    </option> 
 
    </select> 
 
    <span>Selected: {{ selected }}</span> 
 
</div>

しかし、このすべては、Vueの内部で行うことができます。それは外で行う必要はありません。

let app = new Vue({ 
    el: '#app', 
    data: { 
    selected: 'A', 
    options: [] 
    }, 
    methods:{ 
    pullEmployees(){ 
     var eventOwnerId = $('#eventOwner').val(); 
     var eventOwnerName = $('#eventOwner :selected').text(); 
     $.ajax({ 
     url: "employees.cfm", 
     data: { 
      eventOwnerId: eventOwnerId, 
      eventOwnerName: eventOwnerName, 
      method : "updateOwners" 
     }, 
     success: results => this.options = results 
     }); 
    } 
    }, 
    mounted(){ 
    this.pullEmployees() 
    } 
}) 

eventOwnerの場合も同様に、あなただけのVueからデータプロパティとしてその値を得ることができるのVueの一部です。

+0

eventOwnerをVue内に配置する方法の例を教えてください。私のコードから、DOMからこれらの値をどのように読み取っているかを確認できます。 また、「el:#app」は、選択のIDが「app」であることを意味しますか? – DoArNa

+0

@DoArNa私はあなたのコードを遊んでいる間、この[codepen](https://codepen.io/Kradek/pen/OgdrpN)を作りました。それはあなたがそれをやる方法を示しています。明らかに私はあなたのサーバーへのアクセスを持っていないので、それはajax呼び出しを行うときにエラーを投げます。また、所有者が 'mounted'の代わりに変更されたときに、オプションを取得したいかもしれません。 – Bert

+0

これについて私が手伝ってくれる時は本当にありがたいです。ページの読み込み時にわかるように、メアリーとボブのドロップダウンがロードされますが、ページロードのドロップダウンにはajaxコールのオプションがあります。私はあなたがサーバーにアクセスすることはできませんが、少なくともコードがどのように書かれるかということで作業モデルを作りたいと思っていますか?ページがロードされた後にリストオプションを変更できる条件はページ上にありません。したがって、select要素の更新を心配する必要はありません。 – DoArNa

1

ストアあなたVUEインスタンス変数として:

var vue = new Vue(// stuff...); 

、その後、Ajaxはthisの範囲については注意してください:

function pullEmployees(){ 
     var _this = this; // bind "this" to local var 
     var eventOwnerId = $('#eventOwner').val(); 
     var eventOwnerName = $('#eventOwner :selected').text(); 
     $.ajax({ 
      url: "employees.cfm", 
      data: { 
       eventOwnerId: eventOwnerId, 
       eventOwnerName: eventOwnerName, 
       method : "updateOwners" 
      }, 

      success: function(results) { 
       _this.vue.data.options = results; // set data 
      } 
    }); 
} 
+0

私のvueインスタンスでは、オプション属性を空の文字列として開始しますか? (data:{ options:= ""} – DoArNa

+0

おそらく空の配列として初期化するべきです。 – frozen

+0

ありがとう、私はそれを試してみましょう。 – DoArNa

関連する問題