2013-08-16 51 views
0

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

我正在努力解决这个问题。我想出的唯一淘汰赛解决方案是制作一个observable group和一个computed group(分别扩展observable)。 computed group可以订阅observable,它会发出observables事件到其封闭的computeds。同样,包含在observable group中的observable将向父节点发送其事件,这会将其传递给其订阅者。

我不认为这是一个非常好的主意,说实话,但它似乎可以工作。

现在有办法做到这一点吗?例如,假设我有一个动态数量的“投资者”,其中包含动态数量的“优先级”附加到他们和一个动态数字“用户”,计算出现在任何投资者的优先次数多少次,所以我们有这样的事情:

These are the "users"

以上形象代表的用户,他们有多少次出现在投资者名单。这些将是计算出来的观测值。

These are the "investors"

上述图像代表投资者。这些是订阅的观察对象。

还有就是进入创造这些领域的一些额外的信息,所以很多人都是这样创建(这适用于computeds和正常观测):

这里是投资者行后面的标记。

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

我不知道这种方法有多好,我愿意接受任何可能使其更好。

+1

您能否展示一些您的计算结果和可观察结果的样本,以便我们更好地理解关系? –

+0

好的,一分钟左右就会补充。 – Seiyria

+0

@PWKad更新。 – Seiyria

回答

0

只是为了关闭,我想补充一点,我解决了这个使用虚拟可计算,如看到here