【问题标题】:Vue not rendering my dataVue 没有渲染我的数据
【发布时间】:2016-10-20 19:26:37
【问题描述】:

我有一个组件,我在使用 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) 例如,它在控制台中看起来很好。而且我的控制台没有任何错误,所以我不知道为什么它不起作用。

【问题讨论】:

  • 你有适用于 Chrome 的 VueJS 开发工具吗?那里的数据是如何表示的?
  • 是的,我有,但它什么也没显示

标签: laravel vue.js


【解决方案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>

【讨论】:

  • 您的所有代码仅在我的 html 页面上都可以正常工作,但如果我将其放在不同的文件中,则无法正常工作。奇怪的是,如果我放一个 var test:'a' 并尝试在我的模板上渲染它,它就可以正常工作
  • 听起来 Laravel 方面把东西放在一起有问题。不是我有经验的东西。 :(
【解决方案2】:

您正在使用 function.bind(this) 将 this 从外部范围带到函数范围,在您的 $http 成功处理程序中。

您是否检查过它是否没有造成任何问题?我不知道bind 是如何实现的。也许它不允许 Vue 触发它的 Reactivity System

如果您将控制台中的值视为纯 JSON 对象,则可能是错误的。 Vue.js 将对象参数修改为 getter/setter/observers,以便它可以绑定到 DOM。

或者,你为什么不试试箭头函数或使用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
})

【讨论】:

  • 我试过了,也没用。但是我发现当我将这个文件导入另一个文件时会发生这种情况(从“./Feedback”导入反馈;)如果我从另一个文件中删除这个导入,它工作得很好。不能导入带有全局 Vue 组件的文件吗?
  • 我没有尝试过你的做法——在视图组件中使用 jQuery.getJSON,所以我不知道这里出了什么问题。您是否尝试过使用vue-resource? (github.com/vuejs/vue-resource) 那是管理所有http请求的官方插件。
  • vue-resource 也与 getJSON 方法非常相似,您可以查看其 github 页面中的示例。您将执行以下操作:this.$http.get('/someUrl').then(response =&gt; { ... });
  • 是的,我知道vue-resources,使用jquery的原因是因为我正在学习laracast中的教程
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 2016-04-08
  • 2019-09-24
  • 2018-12-17
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多