0

現在、やや複雑なデータ モデルを使用しています。動的に作成されcomputed observablesたグループにサブスクライブする必要がある動的に作成されたグループがありますobservables(つまり、これらの変更のいずれかが変更されobservablesた場合、全体computedを更新する必要があります)。

これを解決しようと頭を悩ませています。私が思いついた唯一のノックアウトっぽい解決策は、observable groupと を作成することでしたcomputed group(それぞれの を拡張しますobservable)。はcomputed groupにサブスクライブでき、同封observableの にイベントを発行します。同様に、 に含まれる はそのイベントを親に発行し、親はそのイベントをサブスクライバーに渡します。observablescomputedsobservableobservable group

正直なところ、それはあまり良い考えではないと思いますが、うまくいくようです。

現在これを行う方法はありますか?

例として、「投資家」の動的数と「優先度」の動的数、および投資家の優先度に表示される回数を計算する「ユーザー」の動的数があるとします。これ:

これらは、

上の画像は、ユーザーと、投資家リストに表示される回数を表しています。これらは、計算されたオブザーバブルになります。

これらは、

上の画像は投資家を表しています。これらは、サブスクライブされているオブザーバブルです。

これらのフィールドの作成に使用される追加情報がいくつかあるため、それらの多くは次のように作成されます (これは、計算されたものと通常のオブザーバブルの両方に適用されます)。

これは、投資家の行の背後にあるマークアップです。

<!-- ko foreach: new Array($root.MaxPriority()) -->
    <td>

        <select data-bind="options: $root.Users, 
                                    optionsText: 'FirstAndLastName', 
                                    optionsValue: 'UserID', 
                                    value: $root.getUserAtPosition($parent.InvestorID, $index() + 1)
                                    "></select>

    </td>
<!-- /ko -->

これは、ユーザーのオブザーバブルを作成する関数です (選択ボックス上)。

self.getUserAtPosition = function (invId, pos) {
    var uniqueSelectInst = ko.observable(function () {
        return 0;
    });

    return uniqueSelectInst;
};

左側のユーザーを作成するマークアップを次に示します。

<!-- ko foreach: Users.slice(1) -->
<tr>
    <td data-bind="text: FirstAndLastName"></td>
    <td><input type="checkbox" /></td>
    <td data-bind="text: $parent.countAppearancesForUser"></td>
</tr>
<!-- /ko -->

そして、これが対応するJSです。

self.countAppearancesForUser = function (priority) {
    return ko.computed(function () {
        //code
    });
};

フィドル形式: http://jsfiddle.net/8U9M4/3/

このアプローチがどれほど優れているかはわかりませんが、それを改善するためなら何でも受け入れます。

4

1 に答える 1