[英]Ember handlebars helper return value
我試圖創建一個幫助程序,使我可以將幫助程序鏈接在一起,例如:
{{ chain "striptags" "<p>asdf</p>" "truncate" 2 }}
但是,似乎沒有在Ember中調用幫助程序后返回值,而是最后一個arg有一個渲染緩沖區,該緩沖區由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.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 。
問題是,車把幫手並沒有真正返回值。 相反,它們直接寫入通過options參數提供的緩沖區中。 在上面的示例中,我直接操作此緩沖區以提取一個助手的乘積並將其作為下一個助手的第一個參數插入(去除余燼元標記只是WTF-ery的一個優點)。
如您所見,它可以在這種簡單的用例中工作,但可能會因涉及更多內容而中斷。 把手幫手並非設計為用作功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.