knockout.js可观察组/计算组

时间:2013-08-16 18:51:53

标签: javascript knockout.js

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

我正试图解决这个问题。我想出的唯一的淘汰解决方案是制作observable groupcomputed group(扩展相应的observable)。 computed group可以订阅observable,它会将observables个事件发送到其所包含的computeds。同样,observable中包含的observable group会向父母发送其事件,并将其传递给其订阅者。

老实说,我认为这不是一个好主意,但它似乎可以奏效。

目前有办法做到这一点吗?

作为一个例子,假设我有一个动态数量的“投资者”,其中附有动态数量的“优先级”,以及一个动态数字“用户”,用于计算他们在任何投资者优先级中出现的次数,因此我们有这样的事情:

These are the "users"

上图显示了用户以及他们在投资者列表中出现的次数。这些将是计算出的可观察量。

These are the "investors"

上图代表投资者。这些是订阅的可观察量。

创建这些字段时会有一些额外的信息,因此很多信息都是这样创建的(这适用于计算和普通的observable):

这是投资者行背后的标记。

         

<!-- 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/

我不知道这种做法有多好,而且我愿意接受能让它变得更好的任何事情。

1 个答案:

答案 0 :(得分:0)

仅仅为了关闭,我想补充一点,我使用虚拟可计算机解决了这个问题,如here所示。