2015-09-05 7 views
14

Próbuję wypełnić Vue danymi z JsonResult zapytania AJAX. Moja Vue odbiera dane po prostu dobrze, gdy koduję je z mojego Modelu widoku, ale nie wtedy, gdy próbuję go pobrać przy użyciu AJAX. Oto, jak wygląda mój kod:Inicjowanie danych Vue za pomocą AJAX

<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> 

Jest to ze wszystkimi właściwymi załącznikami. Wiem, że @Url.Action("GetItems", "Settings") zwraca poprawny adres URL, a dane wracają zgodnie z oczekiwaniami (testowane przez alert w funkcji sukcesu (zobacz komentarz w funkcji sukcesu w AJAX). Wypełniając go tak: var allItems = @Html.Raw(Json.Encode(Model)); działa, ale kwerenda AJAX nie. Czy robię coś źle?

+0

musisz aktualizować dane-elementy widoku po otrzymałeś dane. Zauważ, że ajax jest asynchroniczny (stąd nazwa), więc będziesz miał tylko dane w funkcji zwrotnej 'success'! – Jeff

+0

Jak mogę to zrobić? Nie mogę zrobić ItemsVue.data.Items w porządku? Nie jestem pewien, jak zaktualizować go w tym momencie ... – muttley91

+0

Myślę, że mogę po prostu utworzyć mój Vue w funkcji zwrotu "sukces"! – muttley91

Odpowiedz

37

Możesz wywołać wywołanie ajaxa wewnątrz zamontowanej funkcji ("gotowe" w Vuejs 1.x).

<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

Zobacz, spróbowałem tego. Może robiłem coś złego, nie jestem pewien. – muttley91

+3

Czy to nie ma być 'self.data.Items = data'? – Shikloshi

+1

Ustawienie "self" jako odniesienie do oryginalnego zakresu "tego" jest kluczem –

-8

lepiej wold trzeba użyć

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

Proszę zobaczyć więcej here

1

udało mi się rozwiązać mój problem, wykonując mój niezbędnych działań w ramach obsługi sukces na AJAX Możesz tam umieścić całe tworzenie obiektów Vue, lub po prostu ustaw potrzebne dane.

+0

, czy to źle robić rzeczy w ten sposób? – edward

+0

proszę, udostępnij kod ... – Stephane

+0

@ muttley91 Nawet jeśli ta metoda zadziała, nie oznacza to, że jest właściwa, z pewnością nie powinna być zaakceptowaną odpowiedzią. dzięki za przesłanie pytania. –

-2
Nie

jest inny sposób:

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); 
    } 
} 

I nie zapomnij kasy plik * .php z:

echo json_encode($result); 
+1

Jaki plik php? Ten facet używa '@ Url.Action (" GetItems "," Settings ")', który mówi mi, że jest to język ASP.NET. – Jujunol