#javascript #jquery #laravel #vue.js #multi-select
#javascript #jquery #laravel #vue.js #множественный выбор
Вопрос:
По какой-то причине я не могу понять, как заставить multiselect в стиле автозаполнения работать должным образом с Vue.
Я правильно установил маршрут, который вызывается в моем блоке axios, и контроллер настроен на использование запроса как способа обращения к базе данных с предложением LIKE, но где-то что-то идет не так, и мой multiselect не заполняется результатами из базы данных, которые сделали бы его доступным для поиска.
Что я здесь делаю не так?
Маршрут:
Route::get('search', 'Controller@searchTags')
->name('search');
Контроллер:
public function searchTags(Request $request)
{
if ($request->get('query')) {
$query = $request->get('query');
$data = TAGS::where('TAG_DATA', 'LIKE', "%{$query}%")->get();
$output = '<ul class="dropdown-menu" style="display:block; position:relative">';
foreach ($data as $row) {
$output .= '<li><a href="#">' . $row->tag_data . '</a></li>';
}
$output .= '</ul>';
return $output;
}
}
Блейд:
<div id="tagContent">
<multiselect v-model="value" open-direction="bottom" :options="options" :multiple="true" :close-on-select="false" :taggable="true" :clear-on-select="false" :preserve-search="true" placeholder="Add Tag(s)" label="name" track-by="name">
<template slot="selection" slot-scope="{ values, search, isOpen }"><span class="multiselect__single" v-if="values.length amp;amp;amp;amp; !isOpen">{{ values.length }} options selected</span></template>
</multiselect>
</div>
new Vue({
components: {
Multiselect: window.VueMultiselect.default
},
data () {
return {
value: [],
options: []
}
},
methods: {
read(){
window.axios.get('campaigns/search').then(({ data }) =>{
console.log(data)
});
},
addTag (newTag) {
const tag = {
name: newTag,
code: newTag.substring(0, 2) Math.floor((Math.random() * 10000000))
}
this.options.push(tag)
this.value.push(tag)
}
}
}).$mount('#tagContent');
Комментарии:
1. Не похоже, что вы просите vue что-либо делать с данными, возвращенными из запроса axios. Я также подозреваю, что вам будет проще, если вы просто вернете данные из своего маршрута, а затем позволите vue обрабатывать создание разметки.
2. Что вы имеете в виду, что касается вашего 2-го комментария?
3. @ebbishop что я должен делать именно для возвращаемых данных? Я думаю, что сейчас я в основном застрял. Слишком много элементов для загрузки при загрузке страницы, поэтому я действительно хотел попробовать вызов axios для автозаполнения
4. Его необходимо отправить компоненту vue multiselect в качестве опций, чтобы компонент мог отображать данные. Похоже, вы намереваетесь использовать свойство vue data
options
для заполнения multiselect — когда у вас есть данные, возвращенные с вашего маршрута, вы могли бы сделать что-то вродеthis.options = data
. Мне непонятно, почему вы используете контроллер для обработки данных в разметку и что вы ожидаете, что произойдет с этой разметкой.5. Правда, в контроллере осталось некоторое форматирование, которое я сохранил для тестирования, но я понимаю, что вы имеете в виду. Я мог бы удалить форматирование и просто вернуть результаты в виде объекта json, я думаю
Ответ №1:
Я полагаю, в вашем примере не хватает нескольких вещей.
-
Вам нужно запускать
read
функцию при изменении ввода поиска — используйте@search-change
событие для этого -
Вам нужно использовать результаты вашего запроса axios, отправив их
this.options
, чтобыmultiselect
компонент мог их использовать.
В этом примере я издевался над запросом данных, используя тайм-аут, но вы должны понять идею. Вы также можете использовать loading
свойство, чтобы ваши пользователи знали, что что-то происходит за кулисами.
Комментарии:
1. хорошо, я думаю, что теперь понимаю, спасибо! Таким образом, мой вызов axios на самом деле будет там, где находится ваша функция тайм-аута, и я мог бы просто установить это.параметры = данные там
2.
axios.get('campaigns/search') .then(response => this.options = response.data) .catch(error => {});
что-то вроде этого?3. @TomN. Да! Попробуйте это сделать.
4. Я на самом деле изменил его, сделав это так, чтобы он отправлял «запрос», который мне нужен в контроллере:
axios.get('campaigns/search',{params: {query: this.val}}) .then(function (response) { self.options = response.data; });
Но по-прежнему никаких результатов. Тем не менее, я вижу ответ в своей консоли с json всех моих данных