現在、やや複雑なデータ モデルを使用しています。動的に作成されcomputed observables
たグループにサブスクライブする必要がある動的に作成されたグループがありますobservables
(つまり、これらの変更のいずれかが変更されobservables
た場合、全体computed
を更新する必要があります)。
これを解決しようと頭を悩ませています。私が思いついた唯一のノックアウトっぽい解決策は、observable group
と を作成することでしたcomputed group
(それぞれの を拡張しますobservable
)。はcomputed group
にサブスクライブでき、同封observable
の にイベントを発行します。同様に、 に含まれる はそのイベントを親に発行し、親はそのイベントをサブスクライバーに渡します。observables
computeds
observable
observable 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/
このアプローチがどれほど優れているかはわかりませんが、それを改善するためなら何でも受け入れます。