更改传递给帮助器的控制器属性后,重新计算Ember自定义帮助器

时间:2019-06-28 08:31:33

标签: ember.js

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

此处的示例代码:

我的模板看起来像

{{#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
    }
});

1 个答案:

答案 0 :(得分:1)

我看到您的代码有几个问题:

模板帮助器似乎获得了一个对象,因为它是第一个也是唯一的位置参数:{{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来这样做,但我不建议这样做,因为它是错误的修剪。