如何修改模板中的对象哈希值?

How to modify an object hash's value in a template?

如何在 bar 组件使用 settings 对象之前使用 handlebars 语法或 Ember.js 帮助器为 settings.color 声明新值?

例如

foo-component.js
    settings: { color: "blue", size: 16, ...many others }
foo-template.hbs
    {{yield settings=settings}}

my-route.hbs
    {{#foo as |settings|}}
        #! How to change `settings.color` to "red" here before passing to bar  ? !#
        {{bar settings=settings}}
    {{/foo}}

例如。在哈希场景中

foo-template.hbs
    {{yield settings=(hash color=color size=size)}}

my-route.hbs
    {{#foo color="blue" size=16 as |settings|}}
        #! How to change `settings.color` to "red" here before passing to bar ? !#
        {{bar settings=settings}}
    {{/foo}}

我不知道你为什么需要这个,但如果你需要这个,你可以通过多种方式实现:

  1. 您可以公开所有参数并构建新的设置对象:
{{#foo color="blue" size=16 as |settings|}}
  {{bar settings=(hash size=settings.size x=settings.x y=settings.y color="red")}}
{{/foo}}

这是最明确的方法,但当您 add/remove 将新项目添加到设置哈希时,它很脆弱。

  1. 您可以创建一个助手来覆盖参数:
{{#foo color="blue" size=16 as |settings|}}
  {{bar settings=(override settings color="red")}}
{{/foo}}

在覆盖助手中,您需要执行类似的操作:

export function override(params, hash) {
  const obj = params[0]
  setProperties(obj, hash)
  return obj
}

export default buildHelper(override)

但这也会更新上层组件产生的 hash。如果您有 bar 组件的兄弟,它们也会使用 red。所以你可以考虑创建它的浅拷贝。像这样:

export function override(params, hash) {
  const obj = params[0]
  return Object.assign({}, obj, hash)
}

这样会更安全。

我实现了@ykaragol 答案的修改版本。

创建了一个 assign 助手,它创建了一个清晰的操作心智模型。

import { helper } from "@ember/component/helper";
import { assign as assignMethod } from "@ember/polyfills";

export function assign(params) {
  return assignMethod({}, ...params);
}

export default helper(assign);

用法:

{{foo-component
            properties=(assign componentProperties barProperties blahProperties (hash onClick="foo" backgroundColor="#000"))
        }}