将车把组件输出作为参数传递给助手

时间:2018-10-15 22:04:10

标签: templates ember.js components handlebars.js helper

我想将组件的输出用作帮助程序的参数,但是并没有太大的成功。

我的Ember模板是这样的:

<td class="wrap">
  {{generate-url 'http://stackoverflow.com' 'Visit'}}
</td>

和助手:

import { helper } from '@ember/component/helper';
import { htmlSafe } from '@ember/string';

export function helperFunction (params) {
    if (!params) {
        return "";
    }

    var link = params[0];
    if (!link) {
        return  "";
    }

    var linkText = params[1];
    if (!linkText) {
        linkText = link;
    }

    return new htmlSafe('<a href="' + link + '">' + linkText + '</a>');
}

export default helper(helperFunction);

两个组合成功生成:

<td class="wrap">
  <a href="http://stackoverflow.com">Visit</a>
</td>

现在,我有一个组件(my-component.hbs),它可以输出具有以下内容的HTML:

{{#if name}}
  <span class="red">{{longName}}</span>
{{/if}}

如果在模板中这样引用该组件,则它会起作用:{{my-component name="abc" longName="alphabet"}}(按预期提供<span class="red">alphabet</span>)。

但是我很想尝试将HTML输出放入generate-url的第二个参数中以产生:

<td class="wrap">
  <a href="http://stackoverflow.com"><span class="red">alphabet</span></a>
</td>

我已经天真地尝试{{generate-url 'http://stackoverflow.com' (my-component name="abc" longName="alphabet")}},但是在评估了特定的车把时会输出错误。

1 个答案:

答案 0 :(得分:0)

感谢您的澄清,起初有点难以理解。

我不使用ember.js,而只使用原始的Handlebars.js。但是,在我看来,您无法将帮助程序链接到另一个结果,即使内置的查找帮助程序也无济于事。如果要这样做,可以安装ember-composable-helpers。我在https://github.com/wycats/handlebars.js/issues/304上找到的另一种解决方案是使用自定义帮助程序来链接您的呼叫:

Handlebars.registerHelper('chain', function() {
  var helpers = [];
  var args = Array.prototype.slice.call(arguments);
  var argsLength = args.length;
  var index;
  var arg;

  for (index = 0, arg = args[index];
       index < argsLength;
       arg = args[++index]) {
    if (Handlebars.helpers[arg]) {
      helpers.push(Handlebars.helpers[arg]);
    } else {
      args = args.slice(index);
      break;
    }
  }

  while (helpers.length) {
    args = [helpers.pop().apply(Handlebars.helpers, args)];
  }

  return args.shift();
});

这是通话的一个示例:

{{chain "taxAdd" "formatPrice" this.product.price}}

我希望这会有所帮助。我还将编辑您的帖子以添加emberjs标签,以便其他人最终可以提供更好的答案。