簡體   English   中英

淘汰賽從Yii2獲取JSON到observableArray

[英]Knockout get JSON from Yii2 to observableArray

如何填充從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。

一場小比賽開始了。 在我之前的問題中,我學習了使用基因敲除法按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;
})

有用! 初始化此方法是合適的。 但是,如果我需要在應用程序運行時加載列表數據,該怎么辦? 再想一想! 哦,不! 然后我找到了Christos S的精彩文章 。他提供了通過以下方式將ViewModel綁定到方法的方法:

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

這就是我所需要的! 但是我不喜歡那種非常混亂的HTML。 但是后來我想起了在淘汰賽網站上生活的一種方法

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

現在我很滿意。 好吧,幾乎...我不喜歡在ko.applyBindings()之后調用任何方法的解決方案。 有人可以告訴我如何使它變得更好。 答案令人困惑。 后來我計划將其放在jsfiddle上並與社區共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM