ObservableArray子观察变化监测

时间:2011-07-14 18:14:15

标签: javascript jquery knockout.js

考虑this jsfiddle

我想不出一种方法可以确保如果在下拉列表中已经选择了上一个示例中的第一行,则会阻止下一行选择相同的值。

我认为我的问题是当下拉点击事件触发时,订阅者不会在子值更改时监视此更改。有人能帮忙吗?

viewModel.actualMetrics.subscribe(function(newValue) {
    if (newValue) {
        $.each(viewModel.actualMetrics(), function(n, item) {
            if (item.MetricTypeId() == newValue.MetricTypeId)
                alert("already selected this Metric");
        });
    }

1 个答案:

答案 0 :(得分:0)

以下是实现目标的一种方法的基本示例:http://jsfiddle.net/rniemeyer/3cpUp/

以下是您的样本:http://jsfiddle.net/rniemeyer/8bQmq/

基本思想是你有你的选择列表,然后你创建一个dependentObservable,它是当前使用的选择的索引。这样可以在构建每个行选项时通过当前选项保存一些循环。该索引可以是对象或数组。我使用了一个对象,但你可以使用一个数组,id作为索引。

然后,在每个项目上,您可以使用dependentObservable来存储该项目的已过滤选项。但是,我使用了一个函数,因为它似乎不是一个对视图模型非常重要的属性,并且使用dependentObservables实现了绑定,因此当您将它发送到JSON时,如果没有显示选项,您将获得相同的效果。该函数循环遍历所有选项,并且仅包括通过检查其自身的值和索引而未出现在另一行上的选项。