【问题标题】:Ember handlebars helper return valueEmber 车把助手返回值
【发布时间】:2014-06-30 00:36:42
【问题描述】:

我试图创建一个助手,让我可以将助手链接在一起,例如:

{{ chain "striptags" "<p>asdf</p>" "truncate" 2 }}

但似乎不是在 Ember 中调用助手后返回值,而是最后一个 arg 有一个渲染缓冲区,由 ember 助手操作。有没有办法获取普通的 ember 车把助手并返回值?我的参考代码:

/**
 * Allows some basic chaining of helpers.
 * {{ chain "helper1" arg1 arg2 "helper2" arg2 }}
 */
Ember.Handlebars.helper('chain', function() {
  var helperArgs = [];
  var helper;
  var that = this;
  var options = arguments[arguments.length - 1];
  $.each(arguments, function(i, arg) {
    if(Ember.Handlebars.helpers[arg]){
      if(helper){
        helperArgs.push(options);
        helperArgs = [helper.apply(that, helperArgs)];
      }
      helper = Ember.Handlebars.helpers[arg];
    }else{
      helperArgs.push(arg);
    }
  });
  return helper.apply(that, helperArgs);
});

【问题讨论】:

    标签: ember.js handlebars.js


    【解决方案1】:

    这会有点工作:

    Ember.Handlebars.helper('chain', function() {
        var that = this,
        helpers = [],
        current = null,
        options = arguments[arguments.length - 1];
        for (var i = 0; i < arguments.length - 1; i++) {
            var arg = arguments[i],
            helperFn = Ember.Handlebars.helpers[arg];
            if (helperFn) {
                current = {
                    fn: helperFn,
                    args: []
                };
                helpers.push(current);
            }
            else if (current) {
                current.args.push(arg);
            }
            else {
                throw new Error("Unknown helper: " + arg);
            }
        }
        var prevResult = null;
        $.each(helpers, function (index, helper) {
            var args = helper.args.concat(options),
                before = options.data.buffer.buffer;
            if (prevResult) {
                args.unshift(prevResult);
            }
            helper.fn.apply(that, args);
            var after = options.data.buffer.buffer;
            prevResult = after.slice(before.length).replace(/<\/?script[^>]*>/g, "");
            if (index < helpers.length - 1) {
                options.data.buffer.buffer = before;
            }
        });
    });
    

    JSBin.

    问题是,车把助手并没有真正返回值。相反,它们直接写入通过选项参数提供的缓冲区。在上面的例子中,我直接操纵这个缓冲区来提取一个助手的乘积并将其作为下一个助手的第一个参数插入(去除 ember 元标记只是 WTF-ery 的一个好处)。

    如您所见,它适用于这个简单的用例,但可能会因涉及更多内容而中断。 Handlebars 助手并非设计为用作函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 2013-02-05
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多