1

私は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 があります。

次のように編集しようとするまで、すべて問題ないように見えます。

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();
        }

エラーは発生せず、デバッグしてオブジェクトが変更されたことを確認できますが、valueHasMutated を追加しても画面上で何も変化しないため、計算された説明は更新されません。

4

1 に答える 1

4

あなたの問題は、criItem.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);
}
于 2013-01-14T21:07:32.760 に答える