使用 knockout 以 1 个奇数输入构建 table
Using knockout to build table with 1 odd input
抱歉,问题主题可能不是很准确,但我不确定还可以将其标记为什么。
我正在尝试使用 knockoutjs 干净地创建这个 table 的 2x
除了比较列使用下拉列表而不是静态输入外,保守列和比较列的所有计算都是相同的。
我目前正在使用一个函数来声明两列的所有可观察值,保护因子是一个 ko.calculated 更新所有其他可观察值。
我知道必须有更好的方法来做到这一点,因为我只是重复相同的代码并声明像 aCoverage 和 bCoverage 这样的变量
function vm() {
self.tables = ko.observableArray();
self.tables.push({table: new summaryTable(data)});
}
function summaryTable(data){
this.aindem = ko.observable();
this.alevel = ko.observable(data.level);
this.blevel = ko.observable({id:90,name:"90%"}); //populate dropdown
this.bindem = ko.observable();
this.apremium = ko.observable();
this.bpremium = ko.observable();
this.afactor = ko.computed(function() {
this.aindem(1+2);
this.apremium(3+4);
});
this.bfactor = ko.computed(function() {
this.bindem(1+2);
this.apremium(3+4);
}
有一个外部输入会触发计算重新评估。
因为代码太多,所以我只做了一个 jsfiddle
我认为更好的方法是使用主要对象实例,然后比较对象实例(不止一次比较)并使用 foreach 绑定到这些实例。我已经更新了你的 fiddle 来演示这个
http://jsfiddle.net/ffd4492e/2/
每一列对应一个汇总对象的实例,我添加了一个标志来指示它是比较对象还是主要对象。
self.primaryFlag = ko.observable(primaryFlag);
if(!primaryFlag)
self.head="Compare";
然后在绑定标记中
<td data-bind="visible:primaryFlag, text:score"></td>
<td><select data-bind="visible:!primaryFlag(),options:allLevels, optionsText:'name', value:selLevel"></select></td>
下拉列表只有在比较实例时才会显示...
我也删除了重复的字段。我希望这对您的问题有所帮助。
您的演示在更改值时实际上没有执行任何操作。很难说出你想要它做什么。一个只有几个变量的例子会更容易理解。
您选择了进行许多观察和一些计算,并且计算设置了一堆观察。这不是一个简单的方法。您的可观察量应该包含独立值,并且应该计算基于独立值计算的值。
让我们看看您的两个变量:
self.sCoveragePA((self.score / 100 * data.refBaseValue * ffactor).toFixed(2) );
self.cCoveragePA((self.selLevel().id / 100 * data.refBaseValue * ffactor).toFixed(2));
他们只有一个输入不同。如果您只想拥有一个可以在两个地方使用的 coveragePA
变量,请将其设为依赖于另一个计算成员的计算变量。在一种情况下,计算结果只是 return self.score
;在另一种情况下,self.selLevel().id
.
self.coveragePA = ko.computed(function () {
return (self.controlVar() / 100 * data.refBaseValue * ffactor).toFixed(2);
});
抱歉,问题主题可能不是很准确,但我不确定还可以将其标记为什么。
我正在尝试使用 knockoutjs 干净地创建这个 table 的 2x
除了比较列使用下拉列表而不是静态输入外,保守列和比较列的所有计算都是相同的。
我目前正在使用一个函数来声明两列的所有可观察值,保护因子是一个 ko.calculated 更新所有其他可观察值。
我知道必须有更好的方法来做到这一点,因为我只是重复相同的代码并声明像 aCoverage 和 bCoverage 这样的变量
function vm() {
self.tables = ko.observableArray();
self.tables.push({table: new summaryTable(data)});
}
function summaryTable(data){
this.aindem = ko.observable();
this.alevel = ko.observable(data.level);
this.blevel = ko.observable({id:90,name:"90%"}); //populate dropdown
this.bindem = ko.observable();
this.apremium = ko.observable();
this.bpremium = ko.observable();
this.afactor = ko.computed(function() {
this.aindem(1+2);
this.apremium(3+4);
});
this.bfactor = ko.computed(function() {
this.bindem(1+2);
this.apremium(3+4);
}
有一个外部输入会触发计算重新评估。 因为代码太多,所以我只做了一个 jsfiddle
我认为更好的方法是使用主要对象实例,然后比较对象实例(不止一次比较)并使用 foreach 绑定到这些实例。我已经更新了你的 fiddle 来演示这个
http://jsfiddle.net/ffd4492e/2/
每一列对应一个汇总对象的实例,我添加了一个标志来指示它是比较对象还是主要对象。
self.primaryFlag = ko.observable(primaryFlag);
if(!primaryFlag)
self.head="Compare";
然后在绑定标记中
<td data-bind="visible:primaryFlag, text:score"></td>
<td><select data-bind="visible:!primaryFlag(),options:allLevels, optionsText:'name', value:selLevel"></select></td>
下拉列表只有在比较实例时才会显示...
我也删除了重复的字段。我希望这对您的问题有所帮助。
您的演示在更改值时实际上没有执行任何操作。很难说出你想要它做什么。一个只有几个变量的例子会更容易理解。
您选择了进行许多观察和一些计算,并且计算设置了一堆观察。这不是一个简单的方法。您的可观察量应该包含独立值,并且应该计算基于独立值计算的值。
让我们看看您的两个变量:
self.sCoveragePA((self.score / 100 * data.refBaseValue * ffactor).toFixed(2) );
self.cCoveragePA((self.selLevel().id / 100 * data.refBaseValue * ffactor).toFixed(2));
他们只有一个输入不同。如果您只想拥有一个可以在两个地方使用的 coveragePA
变量,请将其设为依赖于另一个计算成员的计算变量。在一种情况下,计算结果只是 return self.score
;在另一种情况下,self.selLevel().id
.
self.coveragePA = ko.computed(function () {
return (self.controlVar() / 100 * data.refBaseValue * ffactor).toFixed(2);
});