Vue не отображает мои данные

#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