#laravel #vue.js
#laravel #vue.js
Вопрос:
У меня есть компонент, при создании которого я получаю данные с помощью ajax, и я показываю это в шаблоне. В принципе, у меня есть это:
мой код Vue:
Vue.component('feedback-table', {
template: '#grid-template',
data: function () {
return {
chancesOfApproval:[],
}
},
created:function(){
$.getJSON('/getFeedbackQuestionsAndChances',function(data){
this.chancesOfApproval = data.chancesOfApproval;
}.bind(this));
},
});
new Vue({
el: '#feedback-wrapper',
});
И вот мой шаблон:
<template id="grid-template">
<table class="table table-bordered table-responsive table-striped">
<tr v-for="entry in chancesOfApproval">
<td>@{{ entry.position }}</td>
</tr>
</table>
</template>
<div id="feedback-wrapper">
<feedback-table></feedback-table>
</div>
Данные извлекаются из jquery, потому что, например, если я выполняю console.log (this.chanceOfApproval), они отображаются в консоли нормально. И я не получаю никаких ошибок в своей консоли, поэтому я понятия не имею, почему это не работает.
Комментарии:
1. Есть ли у вас инструменты разработки VueJS для Chrome? Как там представлены данные?
2. Да, я делаю, и это ничего не показывает
Ответ №1:
Он ведет себя так, как ожидалось здесь, где я отключил getJSON
для setTimeout
выполнения того же назначения.
Vue.component('feedback-table', {
template: '#grid-template',
data: function() {
return {
chancesOfApproval: [],
}
},
created: function() {
/*
$.getJSON('/getFeedbackQuestionsAndChances', function(data) {
this.chancesOfApproval = data.chancesOfApproval;
}.bind(this));
*/
setTimeout(() => {
this.chancesOfApproval = [{
position: 1
}, {
position: 2
}];
}, 500);
},
});
new Vue({
el: '#feedback-wrapper',
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.min.js"></script>
<template id="grid-template">
<table class="table table-bordered table-responsive table-striped">
<tr v-for="entry in chancesOfApproval">
<td>@{{ entry.position }}</td>
</tr>
</table>
</template>
<div id="feedback-wrapper">
<feedback-table></feedback-table>
</div>
Комментарии:
1. Весь ваш код только на моей html-странице работает нормально, но если я помещу его в другие файлы, он не сработает. Странная часть заключается в том, что если я помещу var test:’a’ и попытаюсь отобразить его в своем шаблоне, он будет работать просто отлично
2. Похоже, что есть проблема со стороной Laravel, собирающей вещи вместе. Не то, с чем у меня есть опыт. : (
Ответ №2:
Вы используете function.bind (this) для переноса this
из внешней области в область функции в вашем $http
обработчике успеха.
Вы проверили, не создает ли это каких-либо проблем? Я не в курсе, как bind
это реализовано. Возможно, это не позволяет Vue запускать свою систему реактивности.
Если вы видите значения в консоли как обычный объект JSON, то, вероятно, это неправильно. Vue.js изменяет параметры объекта на получатели / установщики / наблюдатели, чтобы он мог привязываться к DOM.
В качестве альтернативы, почему бы вам не попробовать функцию arrow или использовать self
переменную, просто чтобы посмотреть, решает ли это проблему?
Функция стрелки (ES6 и выше):
created:function(){
$.getJSON('/getFeedbackQuestionsAndChances',data => {
this.chancesOfApproval = data.chancesOfApproval;
});
}
Или используйте локальную переменную:
created:function(){
var self = this; // self points to this of Vue component
$.getJSON('/getFeedbackQuestionsAndChances',function(data){
self.chancesOfApproval = data.chancesOfApproval;
});
}
Еще одно примечание: вместо setTimeout()
у вас также есть возможность Vue.nextTick()
следующего:
Vue.nextTick(function () {
// DOM updated
})
или в вашем случае:
this.$nextTick(function () {
// DOM updated
})
Комментарии:
1. Я пробовал это, и тоже не сработало. Но я узнаю, что это происходит, когда я импортирую этот файл в другой файл (импортируйте отзыв из «./ Feedback»;) Если я удалю этот импорт из другого файла, он будет работать просто отлично. Не могу ли я импортировать файлы с глобальными компонентами Vue?
2. Я не пробовал ваш способ выполнения — использование jQuery.getJSON внутри компонента view, поэтому я не знаю, что здесь происходит не так. Вы пробовали использовать
vue-resource
? ( github.com/vuejs/vue-resource ) Это официальный плагин для управления всеми http-запросами.3. vue-resource также очень похож на метод getJSON, вы можете посмотреть пример на его странице в github. Вы будете делать следующее:
this.$http.get('/someUrl').then(response => { ... });
4. Да, я знаю о vue-ресурсах, причина использования jquery в том, что я следовал руководству в laracast