在传递给助手的控制器 属性 发生变化时重新计算 Ember 自定义助手

Recompute Ember custom helper on change of a controller property that is passed to the helper

我正在我的控制器中更改 属性 的值,但助手无法重新计算它们。

示例代码在这里:

我的模板看起来像,

{{#if (my-helper info)}}
    <span>Warning</span>
{{/if}}

在我的控制器中,

changeAction: function() {
    let that = this,
        info = that.get("info");
    set(info, "showWarning", true);
}

我的帮手,

import { helper as buildHelper } from '@ember/component/helper';

export default buildHelper(function(params) {
    let that = this,
        info = that.get("info");
    if(info.showWarning ) {
        return true;
    } else {
        return false
    }
});

我发现您的代码有几个问题:

模板助手似乎得到了一个对象,因为它是第一个也是唯一的位置参数:{{my-helper info}}info{ showWarning: true }。如果传递给它的值发生变化,模板助手会重新计算,但如果该值的 属性 发生变化则不会。快速修复是 {{my-helper info.showWarning}}.

在您的模板助手中,您正试图在其 this 上下文中访问 属性。据我所知,这是不支持的。当您使用位置参数并且它是第一个参数时,它可作为 params 数组中的第一个条目使用。所以你的模板助手应该是这样的:

export default buildHelper(function([info]) {
    if(info.showWarning ) {
        return true;
    } else {
        return false
    }
});

您使用的 Ember 是什么版本?如果它 >= 3.1 你不需要在你的控制器中使用 this.get() 。如果您使用 Ember < 3.1,您还需要在模板助手中使用 info.get()

但如前所述,我不建议将对象传递给模板助手,因为它仅在对象本身被替换时才会更新。改变它的 属性 是不够的。您也许可以使用 Class-based Helpers 这样做,但我不建议这样做,因为它会出错。