1

knockout.js での条件付きレンダリングに問題があります。をobservableArray使用して作成されたビューモデルに がありko.utils.arrayMap()ます。私のJavaScriptコードでは、その配列の長さを出力すると、予想される長さが返されます。ただし、ビューで同じ長さを出力しようとすると、常に 0 になります。

ここに私のビューコードがあります:

<!-- ko if: people().length == 0 -->
    <p data-bind="text: people().length"></p>
    <!-- always outputs 0 -->
<!-- /ko -->
<!-- ko if: people().length > 0 -->
    <p data-bind="text: people().length"></p>
    <!-- never reaches this -->
<!-- /ko -->

Javascript:

var data = [
    {
        firstName: "Bob",
        lastName: "Smith"
    },
    {
        firstName: "John",
        lastName: "Doe"
    },
    {
        firstName: "Jane",
        lastName: "Doe"
    }
];

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

function ViewModel(data) {
    var self = this;
    self.people = ko.observableArray(ko.utils.arrayMap(data, function(i) {
        return ko.observable(new Person(i.firstName, i.lastName));
    }));
    console.log(self.people().length);  //Outputs 3, as expected
}

ko.applyBindings(new ViewModel(data));
4

1 に答える 1

3

これは、ビュー モデルに割り当てるのではなく、ビュー モデル内のオブザーバブルを置き換えると発生する可能性があります。self.people = ko.observableArray();ビュー モデル コンストラクターに含まれている可能性があります。後で実際にデータを取得すると、self.people = ko.observableArray(thedata);.

この場合、ビュー モデルはデータを認識していますが、ビューは以前のオブザーバブルにバインドされており、後のオブザーバブルは認識していません。代わりにself.people(thedata);、データを設定する必要があります。

于 2013-06-03T20:12:40.287 に答える