2017-07-13 268 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调用。

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) 
      } 
    }); 
} 

我在真正的新,我将不胜感激,如果有人可以提供帮助。

+0

到目前为止问题是什么?我在你的代码中看到的唯一问题是'this'在你的'success'回调中不会是Vue。 – Bert

+0

我的问题是,我不知道如何将ajax调用的结果附加到vue对象的options属性。如果你在我上面的例子中看到了,我已经对这些选项进行了硬编码(文本:'One',值:'A',文本:'Two',值:'B'等等。) – DoArNa

+0

你说对象降下来作为{id,value}。他们是否需要{文字,价值}? – Bert

回答

1

在下面的例子中,我模仿你的Ajax调用与setTimeout。基本上你想要在变量中捕获new Vue()的结果,然后用你的ajax调用的结果设置该Vue的options属性。

我还更新了您的模板,以反映您返回的选项具有结构{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”是否意味着select的ID是“app”? – DoArNa

+0

@DoArNa我在玩你的代码时建立了这个[codepen](https://codepen.io/Kradek/pen/OgdrpN)。它显示你将如何做到这一点。它在进行ajax调用时会引发错误,因为显然我没有访问您的服务器。此外,您可能希望在所有者更改而不是“挂载”时获取选项。 – Bert

+0

我真的很感激你在这方面帮助我的时间。从我理解的时候,页面加载它会加载下拉与玛丽和鲍勃然而,我想要的是当页面加载下拉有来自ajax调用的选项。我知道你希望能够有一个工作模型,因为你不能访问服务器,但至少会如何编写代码?页面没有加载页面后可以更改列表选项的条件,因此我不必担心更新select元素。 – DoArNa

1

存储您的VUE实例作为一个变量:

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

,然后阿贾克斯小心的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实例上,我是否将空白字符串的选项属性启动? (数据:{ options:=“”} – DoArNa

+0

您应该将其初始化为空数组。 – frozen

+0

谢谢,我会在一分钟内试一试。 – DoArNa