2014-05-12 75 views
0

我试图创建一个帮手,它可以让我链条助手一起想:灰烬车把助手返回值

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

但好像不是调用在灰烬一个帮手,最后ARG后返回值有一个渲染缓冲区,由烬帮手操纵。有没有办法采取一个正常的烬手柄帮手,并返回值?我的参考代码:

/** 
* 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); 
}); 

回答

0

这将整理工作:

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

问题是,handlebars助手并不真正返回一个值。相反,他们直接写入通过options参数提供的缓冲区。在上面的例子中,我直接操作这个缓冲区来提取一个帮助器的产品,并将其作为下一个帮助器的第一个参数插入(剥去ember元标记只是WTF-ery的一个奖励)。你可以看到,它在这个简单的用例中起作用,但是可能会因为涉及更多的东西而破坏。把手帮手只是没有被设计为用作功能。