繁体   English   中英

Knockout.js可观察组/计算组

[英]knockout.js observable groups/computed groups

我目前有一个比较复杂的数据模型可以使用。 我有一组动态创建的computed observables ,它们必须订阅一组动态创建的observables (即,如果这些observables任何一个发生更改,则整个computed必须刷新)。

我挠头试图解决这个问题。 我想到的唯一淘汰赛解决方案是使一个observable group和一个computed group (扩展各个observable )。 computed group可以订阅一个observable ,并且它将observables事件传递给它包含的computeds 同样, observable observable group包含的一个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/

我不知道这种方法有多好,而且我愿意接受任何会使其变得更好的方法。

只是关闭,我想补充一点,我解决了这个使用虚拟computables,因为看到这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM