【问题标题】:Aurelia: Computed / Observable in repeat.forAurelia:在 repeat.for 中计算/可观察
【发布时间】:2016-10-13 06:56:43
【问题描述】:

我的表格中有一些可编辑的数据,其中包含要计算的行和列的总和。

因为我想要更简单的 html 代码,所以我使用 repeat.for 来构建表格的行。为了求和,我使用了一个函数,这是迄今为止我想出的最好的方法。

不幸的是,当我编辑这些值时,总和不会以这种方式更新。 Getter 函数可以通过计算得到,但它们不能接受参数。

我知道我可以写类似 ${$parent.data[y]['Q1'] + $parent.data[y]['Q2'] + ...} 的东西,但这会变得很长,什么是'此示例中的 Q1' 将是现实生活中的动态。 对于列的总和,我将有 15 行需要求和 - 我宁愿不必为此在 html 中编写求和语句。

我正在查看 observatorlocator,但不知道如何将其用于我的案例。我认为这是一个相当简单的场景,所以我希望在 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>

【问题讨论】:

    标签: javascript aurelia


    【解决方案1】:

    绑定行为功能发布后,我们将能够使用“信号”绑定行为来命名值绑定和求和绑定。然后,当值绑定发生变化时,我们将能够“发出信号”来刷新总和绑定。

    在当前版本的 Aurelia 中,您可以将“信号”参数添加到 sumYsumQ 绑定表达式(无需将 arg 添加到视图模型中的实际方法)。然后在视图模型中添加以下代码以“指示”间隔上的绑定:

    signal = 0;
    attached() {
      this.interval = setInterval(() => this.signal++, 120);
    }
    detach() {
      clearInterval(this.interval);
    }
    

    这是一个演示此技术的工作 plunker: http://plnkr.co/edit/3sXQM0


    使用 ObserverLocator 需要对代码进行更多更改。您需要为绑定到输入值的每个属性调用var observer = observerLocator.getObserver(obj, propertyName)。然后你需要打电话给var dispose = observer.subscribe(::this.computeSums)。接下来,您需要将 sum 函数重构为实际属性,以便 computeSums 可以更新它们的值,从而触发 sum 绑定更新。最后,您需要在 detached 方法中处理订阅。

    【讨论】:

    • 谢谢,@Jeremy。我们什么时候可以期待绑定行为特性的发布?测试版?
    • 是的,我们的目标是测试版
    • @JeremyDanyow 假设这现在是最新版本的 aurelia,因为距此评论已有 3 年多了。您有命名绑定方法的示例吗?
    • Plunker 的例子正是我想要的,而不是你@JeremyDanyow!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多