2013-01-14 158 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