1
var viewModel = {
    foos: ko.observableArray([]);
}

var foo = function () {
    this.Prop1 = ko.observable,
    this.Prop2 = ko.observable
};

$.get("/someroute/", "", function(data) {
    for(var i = 0; i< data.length; i++) {
        var f = new foo();
        f.Prop1 = data.Prop1;
        f.Prop2 = data.Prop2;
        viewModel.foos.push(f);
    }
    ko.applyBindings(viewModel);
});

データはgetリクエストから読み込まれ、データを正常にループしますが、viewModel.foosは[0]のままです。

4

1 に答える 1

1

コードにはいくつかの問題があります。

0)の定義が正しくありませんviewModel。する必要があります:

foos: ko.observableArray([])

セミコロンなし;

1)の定義でオブザーバブルを正しく定義していませんfoo。そのはず:

this.Prop1 = ko.observable()

そのため、角かっこ()がありません。

2)前のポイントを念頭に置いて、これはフィールドに値を適用する方法です。

var f = new foo();
f.Prop1(data.Prop1);

3) JavaScriptは配列の長さをキャッシュしないため、ループで使用する場合は常に.lengthlengthプロパティではなく、実際にはゲッターです)、長さはすべての反復で評価されます。次を使用する必要があります。

var l = data.length;
for(var i = 0; i< l; i++) {

4) ko.applyBindingsビューモデルをドキュメントにバインドするために使用されます。getリクエストの最後に使用する理由はわかりませんがget、複数回使用する場合は、必ず例外がスローされます。特に、getDOMを変更していないためです。ko.applyBindingsセクションのどこかで実行する必要があると思います$(document).ready(...)

5)最後に、これらすべての間違いがあっても、コードはある程度機能するはずです。つまり、関連する部分を見てください。

for(var i = 0; i< data.length; i++) {
    // some other code
    viewModel.foos.push(f);
}

fがあっても、viewModelのfoos配列にプッシュされます。その後、長さがfoos0になった場合、それdata.lengthは0であることを意味します(または、質問の意味がわかりません[0])。他に説明はありません。このjsFiddleを参照してください。

6)を使用して実際の配列にアクセスすることを忘れないでくださいviewModel.foos()。したがってviewModel.foos.length、正しくありません。正しい長さはviewModel.foos().lengthです。

于 2012-07-12T17:38:23.087 に答える