2016-10-20 3 views
0

У меня есть компонент, который я получаю данные для создания с помощью ajax, и я показываю это в шаблоне. В принципе у меня есть это:Vue not render my data

мой Вью код:

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> 

Данные быть getted из JQuery, потому что если я console.log (это .chanceOfApproval), например, он отображается в консоли. И я не ошибаюсь в своей консоли, поэтому я понятия не имею, почему это не работает.

+0

У вас есть инструменты VueJS Dev для Chrome? Как представлены данные? –

+0

Да, и я ничего не вижу –

ответ

0

Он ведет себя так, как ожидалось, здесь я отключил 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>

+0

Весь ваш код только на моей странице html отлично работает, но если я помещаю его в разные файлы, он не работает. Странная часть заключается в том, что если я поставлю тест var: «a» и попытаюсь отобразить его на моем шаблоне, он отлично работает –

+0

Похоже, что проблема связана с тем, что сторона Laravel собирает вещи. Не то, с чем у меня есть опыт. :( –

0

Вы используете function.bind (это), чтобы this из внешней сферы в области видимости функции, в обработчике $http успеха.

Вы проверили, не возникли ли какие-либо проблемы? Я не знаю, как реализован bind. Возможно, это не позволяет Vue запускать его Reactivity System.

Если вы видите значения в консоли как простой объект JSON, то это, вероятно, неверно. Vue.js изменяет параметры объекта на геттеры/сеттеры/наблюдатели, чтобы он мог привязываться к DOM.

В качестве альтернативы, почему вы не пытаетесь использовать функцию стрелки или использовать переменную self, просто чтобы узнать, разрешает ли она проблему?

функция Arrow (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 
}) 
+0

Я пробовал это, а также не работал. Но я узнал, что это происходит, когда я импортирую этот файл в другой файл (импорт обратной связи из «./Feedback»;) Если я удалю этот импорт из другого файла, он работает нормально. Не могу ли я импортировать файлы с глобальными компонентами Vue? –

+0

Я не пытался выполнить ваш способ - используя jQuery.getJSON внутри компонента представления, поэтому я не знаю, что здесь происходит. Пробовали ли вы использовать ' vue-resource'? (https: // github.com/vuejs/vue-resource) Это официальный плагин для управления всеми HTTP-запросами. – Mani

+0

vue-resource также очень похож на метод getJSON, вы можете посмотреть пример на своей странице github. Вы будете делать следующее: 'this. $ Http.get ('/ someUrl'). Then (response => {...});' – Mani