示例 jsFiddle
我的模型中有一系列问题,具有以下属性:
- id:很简单,问题的 ID
- text:同样,问题的文本
- parents:此问题所依赖的一系列问题 ID
- activators:一个字符串数组,当父母的答案是这些值之一时 - 显示这个问题
- answer : 这个问题的答案
- visible:一个布尔值,指示此问题是否应在表单上可见
我正在使用ko.mapping
将 JSON 字符串(我从 asmx Web 方法中检索)绑定到我的视图模型。
我有一堆没有或因为这些应该始终可见的主要问题,然后是一堆依赖于他们各自父母的依赖问题,在依赖者可见之前具有一定的价值。这可以扩展到依赖家属依赖家属(如果你明白我的意思)。parents
activators
我最初的想法(因为我正在慢慢地用 knockout.js 到达那里)是订阅answer
我的属性,question
然后获取一组问题,这些问题取决于刚刚回答的问题。然后查看值,将它们与激活器进行比较,并根据需要显示/隐藏。
viewModel.questions().forEach(function (question) {
question.answer.subscribe(function (value) {
var dependents = viewModel.questions().filter(function (q) {
return q.parents() && q.parents().indexOf(question.id()) !== -1;
});
dependents.forEach(function (d) {
if (d.activators() && d.activators().indexOf(value) !== -1) {
d.visible(true);
} else {
d.visible(false);
d.answer(null);
}
});
});
});
虽然这有效,但我不禁觉得我在这里错过了一个技巧。我必须使用ko.mapping
将模型绑定到我的视图模型,因为它已经在 asmx 方法中为我创建了,所以我必须扩展我的视图模型(就像我在这里通过循环遍历所有questions
并订阅每个一样。
也许我应该使用ko.computed
可见属性,或者我应该创建某种自定义ko.bindingHandlers
?我不确定。尝试实现我想要的正确方法是什么?