2015-09-05 15 views
14

VUEにAJAXクエリのJsonResultからのデータを入力しようとしています。 My Vueは、ビューモデルからデータをエンコードするときにデータを受け取るだけですが、AJAXを使用してデータを取得しようとするとデータは受信されません。私のコードは次のようになります: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));は動作しますが、成功しません。私が何か間違ったことをやっているか?

+0

あなたは後にビューのデータ項目を更新する必要がありますが、あなたはそのデータを受け取りました。注意してください。ajaxは非同期(したがって名前)なので、 'success'コールバック関数の中にのみデータがあります。 – Jeff

+0

どうすればいいですか? ItemsVue.data.Itemsはできません。私はその時点でそれを更新する方法がわかりません... – muttley91

+0

私は 'success'コールバック関数で私のVueを作成することができますね! – muttley91

答えて

37

マウントされた関数内でajax呼び出しを行うことができます(Vuejs 1.xでは "ready")。

<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

オリジナルの "this"スコープへの参照としての "self"の設定は –

-8

より良いあなたは

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

をご覧下さい使用する必要がウォルドよりhere

1

私はAJAXの成功ハンドラ内での私の必要なアクションを実行することによって、私の問題を解決することができましたVueオブジェクトの作成全体をそこに配置するか、必要なデータを設定するだけです。

+0

down票で作成した場合は、最初にグローバルスコープ内でvarを定義するだけで済みます。このようにするのは悪いですか? – 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

関連する問題