2015-09-05 38 views
14

我正在尝试使用AJAX查询的JsonResult中的数据填充Vue。当我从我的视图模型对它进行编码时,我的Vue接收数据就好了,但当我尝试使用AJAX检索它时,我的Vue没有收到数据。这是我的代码的样子:使用AJAX初始化Vue数据

<script type="text/javascript"> 

     var allItems;// = @Html.Raw(Json.Encode(Model)); 

     $.ajax({ 
      url: '@Url.Action("GetItems", "Settings")', 
      method: 'GET', 
      success: function (data) { 
       allItems = data; 
       //alert(JSON.stringify(data)); 
      }, 
      error: function (error) { 
       alert(JSON.stringify(error)); 
      } 
     }); 

     var ItemsVue = new Vue({ 
      el: '#Itemlist', 
      data: { 
       Items: allItems 
      }, 
      methods: { 

      }, 
      ready: function() { 

      } 
     }); 
</script> 

<div id="Itemlist"> 
    <table class="table"> 
     <tr> 
      <th>Item</th> 
      <th>Year</th> 
      <th></th> 
     </tr> 
     <tr v-repeat="Item: Items"> 
      <td>{{Item.DisplayName}}</td> 
      <td>{{Item.Year}}</td> 
      <td></td> 
     </tr> 
    </table> 
</div> 

这是与所有适当的包括。我知道@Url.Action("GetItems", "Settings")返回正确的URL,并且数据按预期返回(通过成功函数中的警报测试(请参阅AJAX中的成功函数中的注释)。如下所示填充它:var allItems = @Html.Raw(Json.Encode(Model));有效,但AJAX查询不适用。我是不是做错了什么?

+0

你必须后更新视图的数据项你已收到数据。请注意,ajax是异步的(因此名称),所以您只会在'success'回调函数中拥有数据! – Jeff

+0

我该怎么做?我不能做ItemsVue.data.Items吗?我不知道如何更新它... – muttley91

+0

我想我可以在'success'回调函数中创建我的Vue! – muttley91

回答

37

您可以在安装的功能(Vuejs 1.x中的“就绪”)内进行ajax调用。

<script type="text/javascript"> 
var ItemsVue = new Vue({ 
    el: '#Itemlist', 
    data: { 
     items: [] 
    }, 
    mounted: function() { 
     var self = this; 
     $.ajax({ 
      url: '/items', 
      method: 'GET', 
      success: function (data) { 
       self.items = data; 
      }, 
      error: function (error) { 
       console.log(error); 
      } 
     }); 
    } 
}); 
</script> 

<div id="Itemlist"> 
    <table class="table"> 
     <tr> 
      <th>Item</th> 
      <th>Year</th> 
     </tr> 
     <tr v-for="item in items"> 
      <td>{{item.DisplayName}}</td> 
      <td>{{item.Year}}</td> 
     </tr> 
    </table> 
</div> 
+1

看,我试过了。也许我做了一些其他的错误,我不确定。 – muttley91

+3

难道这不是'self.data.Items = data'吗? – Shikloshi

+1

设置“自我”作为参考原始的“这个”范围是关键 –

-8

你更好沃尔德需要使用

$("#Itemlist").load(yourUrl, function() { 
    alert("Load was performed."); 
}); 

请查看更多here

1

我能够通过对AJAX成功处理程序中执行我的必要行动,以解决我的问题你可以把整个Vue对象创建在那里,或者只是设置你需要的数据。

+0

反对票中创建它,这样做是不是很糟糕? – edward

+0

请分享代码... – Stephane

+0

@ muttley91尽管这种方式可行,但这并不意味着是正确的,当然这不应该是被接受的答案。感谢您发布问题。 –

-2

还有另一种方法:

new Vue({ 
el:"#app", 

data:{ 
    populateByAjax:{} 

}, 

beforeCompile: function() { 
    this.getRequestByAjax(); 
}, 
methods:{ 
getRequestByAjax:function(){ 
     var xhr = new XMLHttpRequest(); 
     var args = "action=lol"; 
     var self = this; 

     xhr.open('POST', './filephp', true); 
     xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

     xhr.onready = function (aEvt) { 
      if(xhr.readyState == 4 && xhr.status==200) { 
       self.populateByAjax = JSON.parse(xhr.responseText); 
       console.log(self.populateByAjax); 
      } 
     } 
     xhr.send(args); 
    } 
} 

而且不要忘记完成你的*。PHP文件有:

echo json_encode($result); 
+1

什么PHP文件?这个人正在使用'@ Url.Action(“GetItems”,“Settings”),它告诉我这是一种ASP.NET语言。 – Jujunol