1

オブジェクトの observableArray をループしたいのですが、このループでは、別の observableArray の対応する値を取得する必要があります。私はこれを行うことに成功しません。

私のコードは次のとおりです。

モデルとビューモデル:

//**********MODEL********************
function Configuration() {
var self = this;

self.properties = ko.observableArray();
}

function deviceProperty() {
    var self = this;

    self.property = ko.observable("");
    self.value = ko.observable("");
}

//**********VIEWMODEL****************
function compareModelView() {
var self = this;

self.config1 = ko.observable(new Configuration);
self.config2 = ko.observable(new Configuration);

$().ready(function () {
    //Load config1 and config2
});

}

//**********jQuery********************
(function ($) {
    $(document).ready(function () {
        ko.applyBindings(new compareModelView());
    });
})(jQuery);

意見:

<!-- ko foreach: config1().properties -->
     <tr>
     <td data-bind="text: property()"></td>
     <td data-bind="text: value()"></td>
     <td data-bind="text: $root.config2().properties()[$index].value()"></td>
     </tr>
<!-- /ko -->

Knockoutjs は、このプロパティが存在しないというエラーを返します。

私が行う$root.config2().properties().lengthと、数字(3)が返されます。私が行う$root.config2().properties()[0]と、[オブジェクト] [オブジェクト]が返されます。私が行う$root.config2().properties()[0]と、空の文字列が返されます。

しかし、オブジェクト内の value プロパティを直接アドレス指定する方法がわかりません。

4

1 に答える 1

1

$indexは観測可能なプロパティ ( doc$index()を参照) であるため、その値を取得するには書き込む必要があります。

したがって、次のバインディングが機能するはずです。

<td data-bind="text: $root.config2().properties()[$index()].value()"></td>

あなたの主な問題はでした$index()が、このシナリオではコレクションの作成順序が重要であるため、それ自体ではケースを解決できず、現在のセットアップでエラーが発生します。

したがって、最初に入力すると、config1()KO はテーブルのバインドを開始しますが、config2()まだ入力されていない場合、未定義のエラーが発生します。それを修正するには、最初に入力するように入力順序を変更する必要がありますconfig2()

ここでこれを試すことができます: http://jsfiddle.net/xwjKK順序pupulateConfig2を変更し、pupulateConfig1呼び出して効果を確認してください。

于 2013-06-11T11:14:40.653 に答える