2015-09-05 101 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