好吧,这是一个有点奇怪的情况,但我认为这并不罕见,但遗憾的是,我的谷歌功能在这方面很弱。
这是一个场景,我有一个VM(koQuestion),它接受一个函数,该函数决定是否应该显示问题。我正在传递一个函数,该函数检查另一个koQuestion(q2)的值,看看是否应该显示该问题(q2a)。
我的问题是q2a总是被显示,并且当q2的值改变时,它不会重新评估q2a上计算的isDisplayed函数。我找到了这根线(https://github.com/knockout/knockout/issues/1019)并尝试了forceComputed方法,但它仍然无法正常工作。
由于某种奇怪的原因,我无法将代码粘贴到这里,所以我创建了小提琴来说明这个问题。
这是VM 的问题实例
var KoQuestion = function koQ(text, manditory, displayCondition, type, formId) {
var self = this;
var regEx = /^d{1,5}[az]?.?t?/;
self.Text = text;
self.Required = manditory;
self.isDisplayed = ko.computed(function qDisplay() {
if (!displayCondition)
return true;
return displayCondition();
}, self);
self.Type = type;
self.FormId = formId;
self.Name = ko.computed(function () {
return self.Text.replace(regEx, '');
});
self.Value = ko.observable('');
self.rdoValue = ko.computed(function () {
var selectedVal = "";
var selected = $("input[type='radio'][name='" + self.FormId + "']:checked");
if (selected.length > 0) {
selectedVal = selected.val();
}
self.Value = selectedVal;
return selectedVal;
});
};
https://jsfiddle.net/SneeKeeFahk/3nkachhw/1/
您的第一个问题是视图中的绑定:
<!-- if: isDisplayed() -->
应该是:
<!-- ko if: isDisplayed() -->
否则,Knockout根本不知道它应该为此担心。
然后我会改变你对收音机按钮的束缚,因为它是向后的。视图模型不应该必须通过选择DOM的部分来访问视图。你的视图应该绑定你的视图模型,而不是相反。试试这样的东西:
self.rdoValue = ko.observable('');
然后像这样绑定:
<input type="radio" value="Yes" data-bind="attr: { 'name': FormId }, css: { mandatory: Required }, checked: rdoValue" class="awlc" />
重要的部分是使用已检查的绑定,而不是value
绑定。
这是一个工作小提琴