2016-12-02 8 views
0

yii2から取得したobservableArrayデータをどのように埋めることができますか?のは、私はノックアウトアプリケーションで静的なJSONの配列を持っているとしましょう:ノックアウトはYii2からobservableArrayまでJSONを取得します

var countries = [{"id": 1, "name": "1"}, {"id": 2, "name": "2"}, {"id": 3, "name": "3"}] 

私はこれを行うと:

var VM = function(){ 
this.countries = ko.observableArray(countries);}; 

それはすべて良いことです。そして、私はHTMLタグ選択のためにそれを使い続けることができます。しかし、サーバーからデータを取得しようとすると、動作しません。ここに私がやろうとしている方法があります。サーバーからのデータ :

$d = Countries::find()->all(); 
$r = Yii::$app->response(); 
$r->format = Response::FORMAT_JSON; 
$r->data = $d; 
return $r; 

ノックアウトアプリケーションコード:

var VM = function(){ 
this.countries = ko.pureComputed(function(){$.getJSON("/index.php?r=countries/index").done(function(data){return data;});});}; 

ブラウザ(/index.php?r=countries/index)から見た場合、配列が正しいになります

[{"id": 1, "name": "1"}, {"id": 2, "name": "2"}, {"id": 3, "name": "3"}] 

しかし、私は観察可能な配列に結合する方法を理解できません。どのように私はサーバーからデータを取得し、observableArrayとしてそれらを作るのですか?

+0

あなたはそれをフィドルに入れることができますか? – gkb

+0

今日はできません。電話で書く。 – starmucks

答えて

0

少しレースが始まりました。私のprevious questionでは、knockoutjsを使って複数のリストをIDでバインドする方法を学びました。次のステップは、サーバーからリストを取得することでした(json yii2から)。すべてが非常にシンプルなはずですが、何かがうまくいかないようでした。正確にここで問題が発生し、私は地元のコミュニティに尋ねることにしました。私は長い間、それを行う方法を考えていたので、別のオプションを試してみました。最後に、リストを読み込むためにアプリを初期化していました。このようなもの:

var C = function(){ 
    this.t = ko.observableArray(); 
    var loadFrom = function(){ 
      $.getJSON("someUrl", function(data){ 
        $.each(data, function(index, value){ 
         t.push({'id': value.id, 'name': value.name}); 
        }); 
      }); 


    }; 
     } 
var VM = function(){ 
} 

    $(function(){ 
     ko.applyBindings(new VM()); 
     C.loadFrom; 
}) 

これは機能します。この方法を初期化するのが適切です。しかし、アプリケーションの実行時にリストデータをロードする必要がある場合はどうしますか?もう一度考える!ああ!そして私は、彼は次のようにメソッドにViewModelにバインドするために提供していますクリストスS.によってgreat postが見つかりました:

<select data-bind:"optionsValue: 'AlbumId', event: { change: function (data, event) { showAlbumTracks($('#selectArtistAlbums').val(), data, event) } }"></select> 

これは私が必要なものです!しかし、私は非常に混乱したHTMLが好きではなかった。しかし、私は今、私は満足していますknockout website.

self.category.subscribe(function() { 
    self.product(undefined); 
}); 

すべてに生きている例の一つの方法を思い出しました。まあ、ほとんど...私はko.applyBindings()の後に任意のメソッドを呼び出すという解決策が嫌いです。誰かがそれをより良くする方法を教えてもらえますか?答えは混乱していた。後で私はこれをjsfiddleに置き、コミュニティと分かち合う予定です。

関連する問題