我目前有一个有点复杂的数据模型可以使用。我有一组动态创建computed observables
的必须订阅一组动态创建的observables
(即,如果其中任何一个observables
更改,整个computed
必须刷新)。
我正在挠头试图解决这个问题。我想出的唯一淘汰赛解决方案是制作 anobservable group
和 a computed group
(扩展各自的observable
)。computed group
可以订阅,observable
并将observables
事件发送到其封闭的computeds
. 同样,observable
包含在 an 中的 anobservable group
会将其事件发送给父级,父级会将其传递给其订阅者。
老实说,我认为这不是一个好主意,但它似乎可以工作。
目前有没有办法做到这一点?
举个例子,假设我有一个动态数量的“投资者”,并附有一个动态数量的“优先级”,以及一个动态数量的“用户”,用于计算他们在任何投资者优先级中出现的次数,所以我们有类似这个:
上图代表用户,以及他们在投资者列表中出现的次数。这些将是计算出来的 observables。
上图代表投资者。这些是订阅的 observables。
创建这些字段有一些额外的信息,所以其中许多都是这样创建的(这适用于计算和普通的 observables):
这是投资者行背后的加价。
<!-- 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 -->
这是为用户创建 observable 的函数(在选择框上)。
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/
我不知道这种方法有多好,我愿意接受任何可以使它变得更好的方法。