#ajax #vue.js
#ajax #vue.js
Вопрос:
Я новичок в Vue.js . Я был заинтересован в создании динамического выпадающего списка с Ajax в Vue.js . Я понятия не имею, как заполнить тег выбора данными из API, который размещен в Google App Engine (GAE) и выполнен в Flask.
Файл index.html
<div id="app2">
<select v-model="table_list">
<option v-for="item in table_list" :value="item">{{ item }}</option>
</select>
</div>
new Vue({
el: '#app2',
data: {
table_list: []
},
created: function () {
var tableList = this.tableList
axios.get('API_URL').then(function (response) {
for (var i = 0; i < response.data.length; i ) {
tableList.push(response.data[i])
}
}).catch(function (error) {
console.log('failure')
})
}
Данные API:
["test","test1","test2","test3"]
Файл flask.py
from flask import Flask, request
from google.cloud import bigquery
from flask import jsonify
app = Flask(__name__)
@app.route('/')
def tables_list():
client = bigquery.Client()
dataset_id = 'test_table'
tables = client.list_tables(dataset_id) # Make an API request.
tables_list = [];
for table in tables:
tables_list.append(table.table_id)
return jsonify(tables_list)
if __name__ == "__main__":
app.run()
Ответ №1:
v-model="table_list"
должна быть выбранная модель, а не сам список.
<select v-model="table_list_selected">
<option v-for="item in table_list">{{ item }}</option>
</select>
И data:
должен возвращать функцию, плюс имя модели table_list
, а не tableList
new Vue({
el: '#app2',
data: () => ({
table_list: [],
table_list_selected: ''
}),
Кроме того, если вы хотите сохранить область действия this
при вызове функции, либо используйте функции со стрелками, либо привязку this
к функции, либо отмените обратный вызов и используйте async / await .
created: function () {
axios.get('API_URL').then(response => {
this.table_list = response.data
}).catch(function (error) {
console.log('failure')
})
}
Или с помощью bind()
created: function () {
axios.get('API_URL').then(function(response) {
this.table_list = response.data
}.bind(this)).catch(function (error) {
console.log('failure')
})
}
Или с помощью async / await
created: async function () {
try {
this.table_list = await axios.get('API_URL').data
} catch (e) {
console.log('failure')
}
}
Комментарии:
1. Спасибо за ваш прекрасный код. Я перепробовал их все, но тег option кажется пустым. Существует ли какой-либо prom в формате данных api?? и я добавил студентку с исходным кодом API (flask.py ) для вашей справки
2. посмотрите на сетевую вкладку консоли браузера для структуры, убедитесь, что вы исправили опечатку и отладили
this.table_list
, не видя ваш полный код таким, какой он есть, когда он не работает, не могу точно сказать, в чем проблема3. Я выполняю отладку в консоли разработчика Chrome и обнаружил, что этот выпуск вызван политикой CORS. спасибо за ваш отличный совет
Ответ №2:
Вы можете рассмотреть возможность использования существующего гибкого решения для выбора / выпадающих списков со встроенной поддержкой динамического содержимого.
Например, Vue-множественный выбор.
Комментарии:
1. Я выполняю отладку в консоли разработчика Chrome и обнаружил, что этот выпуск вызван политикой CORS. спасибо за ваш отличный совет
2. CORS = совместное использование ресурсов из разных источников