knockout:如何编写可观察数组元素之间的相互依赖性

时间:2015-01-04 21:19:46

标签: javascript knockout.js

我有一个场景,我必须向用户显示问题列表。我在淘汰赛中遇到了可观察阵列和foreach绑定。我可以轻松地与他们一起显示问题列表。

但是,我的要求是问题是相互依存的。比如说。如果第一个问题的响应为“a”,则必须显示问题2,如果问题2的响应为“b”,则应显示问题4,5。我怎么能用淘汰赛来做这个?

我正在考虑为每个问题使用计算字段并根据它们定义可见条件。但我无法想到一个完整的解决方案。任何建议都会非常有帮助。提前致谢

1 个答案:

答案 0 :(得分:1)

你的直觉是正确的;最简单的方法是在可见性绑定中使用计算的observable。举个简单的例子,这应该有效:

var ANSWER = { // psuedo-enum
    A : 'a',
    B : 'b',
    C : 'c',
    NONE : null
};

var questionOne = {
    text : 'foo',
    answer : ko.observable(ANSWER.NONE),
    shouldDisplay : true        
};

var questionTwo = {
    text : 'bar',
    answer : ko.observable(ANSWER.NONE),
    shouldDisplay : ko.computed(function(){
        return questionOne.answer() === ANSWER.B;
    })
};

var questionThree = {
    text : 'baz',
    answer : ko.observable(ANSWER.NONE),
    shouldDisplay : ko.computed(function(){
        return questionOne.answer() === ANSWER.B && questionTwo.answer() === ANSWER.C;
    })
};

var someViewModel = {
    questions : ko.observableArray([questionOne, questionTwo, questionThree]);
};

在这种情况下,元素是硬编码的。这样做是不可维护的。可能你可以设计一些避免重复的方法,并以更紧凑的方式存储每个问题的规范。但是,如何做到这一点超出了简短的Stack Overflow答案的范围!不过,我建议你有问题陈述他们的依赖关系,而不是让早期问题管理其他问题的状态,可以这么说。

我希望这有点线索。