2014-05-12 70 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的一個獎勵)。你可以看到,它在這個簡單的用例中起作用,但是可能會因爲涉及更多的東西而破壞。把手幫手只是沒有被設計爲用作功能。