我在表格中有一些可编辑的数据,其中包含要计算的行和列的总和。
由于我想要更简单的html代码,我使用repeat.for来构建表的行。为了建立一个总和,我使用了一个函数,这是我迄今为止提出的最佳方法。
不幸的是,当我编辑值时,总和不会以这种方式更新。 Getter函数将通过计算,但他们无法获取参数。
我知道我可以写一些像$ {$ parent.data [y] [' Q1'] + $ parent.data [y] [' Q2'] + ..但是这会变得相当长,而且这是什么' Q1'在这个例子中将是现实生活中的动态。 对于列的总和,我有15行必须求和 - 我宁愿不用在html中写一个sum语句。
我正在看天文台,但我没有理解我的情况。我认为这是一个相当简单的szenario,所以我希望在Aurelia有一个很好的解决方案。
test.js
export class Test {
data = {
"2015": { "Q1": 7318, "Q2": 6215, "Q3": null, "Q4": 3515 },
"2016": { "Q1": 1234, "Q2": 2345, "Q3": 3345, "Q4": 3000 },
"2017": { "Q1": 4233, "Q2": 999, "Q3": 1234, "Q4": 3268 },
"2018": { "Q1": 7375, "Q2": 4415, "Q3": 8415, "Q4": 1005 },
"2019": { "Q1": null, "Q2": 5698, "Q3": 1254, "Q4": 6635 }
};
years() {
return Object.keys(this.data);
}
sumY(y) {
var sum = 0;
Object.values(this.data[y])
.forEach(function(item){
sum += item;
});
return sum;
}
sumQ(q) {
var sum = 0;
Object.values(this.data)
.forEach(function(item) {
sum += item[q];
});
return sum;
}
}
的test.html
<template>
<table>
<thead>
<tr>
<td>Year</td>
<td>Q1</td>
<td>Q2</td>
<td>Q3</td>
<td>Q4</td>
<td>Sum</td>
</tr>
</thead>
<tbody>
<tr repeat.for="y of years()">
<td>${y}</td>
<td><input type="text" value.bind="$parent.data[y]['Q1']" /></td>
<td><input type="text" value.bind="$parent.data[y]['Q2']" /></td>
<td><input type="text" value.bind="$parent.data[y]['Q3']" /></td>
<td><input type="text" value.bind="$parent.data[y]['Q4']" /></td>
<td class="ansatz">${$parent.sumY(y)}</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>Sum</td>
<td>${sumQ("Q1")}</td>
<td>${sumQ("Q2")}</td>
<td>${sumQ("Q3")}</td>
<td>${sumQ("Q4")}</td>
</tr>
</tfoot>
</table>
</template>
答案 0 :(得分:4)
当释放绑定行为功能时,我们将能够使用“信号”绑定行为来命名值绑定和总和绑定。然后,当值绑定发生变化时,我们将能够“发信号通知”和绑定以刷新。
在当前版本的Aurelia中,您可以为sumY
和sumQ
绑定表达式添加“signal”参数(无需将arg添加到视图模型中的实际方法)。然后在视图模型中添加以下代码以“信号”在一个区间上的绑定:
signal = 0;
attached() {
this.interval = setInterval(() => this.signal++, 120);
}
detach() {
clearInterval(this.interval);
}
这是一个展示这种技术的工作人员: http://plnkr.co/edit/3sXQM0
使用ObserverLocator需要对代码进行更多更改。您需要为绑定到输入值的每个属性调用var observer = observerLocator.getObserver(obj, propertyName)
。然后你需要拨打var dispose = observer.subscribe(::this.computeSums)
。接下来,您需要将sum函数重构为实际属性,以便computeSums
可以更新它们的值,从而触发sum绑定更新。最后,您需要在分离方法中处理订阅。