2013-01-14 201 views
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持有這些,我一推:model.criteriaEntries.push(新reportCriteria(paramshere));

所有看起來不錯,直到我嘗試編輯一個像這樣:

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

你的問題是,你通過criItem.optionText = opttext覆蓋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); 
} 
+0

但它不是一個可觀察 – user1166905

+0

是它是。在你發佈的代碼中,optionText被設置爲這樣:optionText:ko.observable(optionText) –

+0

道歉,那是我的錯誤。它不是一個可觀察的我相應地改變了上面的代碼。這是因爲我試圖將其改爲可觀察的測試,但沒有任何區別,在改回之前必須複製代碼,對不起。 – user1166905