Knockout.js 淘汰计算未更新

Knockout.js 淘汰计算未更新,knockout.js,Knockout.js,我在JS中有以下内容: function reportCriteria(fieldId,fieldName,filterOption,optionText,filterChoice) { return { fieldId: fieldId fieldName: fieldName, filterOption: filterOption, optionText: optionText,

我在JS中有以下内容:

function reportCriteria(fieldId,fieldName,filterOption,optionText,filterChoice) {
        return {
            fieldId: fieldId
            fieldName: fieldName,
            filterOption: filterOption,
            optionText: optionText,
            filterChoice: filterChoice,
            description: ko.computed(function () {
                return fieldName + " which " + optionText + " " + filterChoice;
            })
        };
    }
我的模型中有一个observableArray,其中包含我推送的对象:model.criteriaEntries.pushnew reportCriteriaparamshere

在我尝试编辑一个之前,一切看起来都正常,如下所示:

var criItem = ko.utils.arrayFirst(model.criteriaEntries(), function (item) {
            return item.fieldId == id;
        });
        if (criItem) {
            criItem.filterOption = option;
            criItem.optionText = opttext;
            criItem.filterChoice = choice;
            model.criteriaEntries.valueHasMutated();
        }

我没有收到任何错误,我可以调试并查看对象已更改,但计算的描述不会更新,因为屏幕上没有任何更改,尽管添加的值已发生了变化?

您的问题是您正在通过critem.optionText=opttext覆盖optionText

不要那样做。相反,请更新optionText:

criItem.optionText(opttext);
然后,您的计算机将相应地更新

编辑以下是您的报表创建代码的外观:

function reportCriteria(fieldId,fieldName,filterOption,optionText,filterChoice) {
    var report = {
       fieldId: fieldI),
       fieldName: fieldName,
       filterOption: ko.observable(filterOption),
       optionText: ko.observable(optionText),
       filterChoice: ko.observable(filterChoice)
    };
    report.description = ko.computed(function () {
       return report.fieldName + " which " + report.optionText() + " " + report.filterChoice();
    });
    return report;
}
以下是如何进行编辑:

var criItem = ko.utils.arrayFirst(model.criteriaEntries(), function (item) { return item.fieldId == id; });
if (criItem) {
   criItem.filterOption(option);
   criItem.optionText(opttext);
   criItem.filterChoice(choice);
}

您的问题是您正在通过critem.optionText=opttext覆盖optionText

不要那样做。相反,请更新optionText:

criItem.optionText(opttext);
然后,您的计算机将相应地更新

编辑以下是您的报表创建代码的外观:

function reportCriteria(fieldId,fieldName,filterOption,optionText,filterChoice) {
    var report = {
       fieldId: fieldI),
       fieldName: fieldName,
       filterOption: ko.observable(filterOption),
       optionText: ko.observable(optionText),
       filterChoice: ko.observable(filterChoice)
    };
    report.description = ko.computed(function () {
       return report.fieldName + " which " + report.optionText() + " " + report.filterChoice();
    });
    return report;
}
以下是如何进行编辑:

var criItem = ko.utils.arrayFirst(model.criteriaEntries(), function (item) { return item.fieldId == id; });
if (criItem) {
   criItem.filterOption(option);
   criItem.optionText(opttext);
   criItem.filterChoice(choice);
}

但事实并非如此。在您发布的代码中,optionText的设置如下:optionText:ko.observateOptionText抱歉,这是我的错误。这不是一个可观察的,我已经相应地更改了上面的代码。出现这种情况是因为我尝试将其更改为一个可观察的测试,但没有任何区别,必须在更改回之前复制了代码,抱歉。更改普通值时,计算机不知道更新。它只知道在您更改了可观察对象时进行更新。我将更新我的答案以向您显示正确的代码。看起来我犯的错误是没有将所有相关字段作为可观察项返回。使用了上面的代码,而且更干净,谢谢。但这不是一个好主意。在您发布的代码中,optionText的设置如下:optionText:ko.observateOptionText抱歉,这是我的错误。这不是一个可观察的,我已经相应地更改了上面的代码。出现这种情况是因为我尝试将其更改为一个可观察的测试,但没有任何区别,必须在更改回之前复制了代码,抱歉。更改普通值时,计算机不知道更新。它只知道在您更改了可观察对象时进行更新。我将更新我的答案以向您显示正确的代码。看起来我犯的错误是没有将所有相关字段作为可观察项返回。使用了上面的代码,而且更干净,谢谢。