Knockout JS-用于从另一种方法评估计算机属性



好吧,这是一个有点奇怪的情况,但我认为这并不罕见,但遗憾的是,我的谷歌功能在这方面很弱。

这是一个场景,我有一个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绑定。

这是一个工作小提琴

最新更新