如果我们具有以下上下文:
C#
List<people> lst = new List<people>();
lst.add(new people{Name='mark'});
lst.add(new people{Name='james'});
lst.add(new people{Name='anthony'});
让我们考虑一个将生成HTML列表的助手:
{{#list people}}{{firstName}} {{lastName}}{{/list}}
在这里,如何将循环限制为仅容纳2个人(如果可能,还希望从列表中随机抽取一些人),而不是遍历整个数组。
更新:
我正在使用Handebars.Net参考:https://github.com/rexm/Handlebars.Net
实际上,我正在从c#传递people对象,例如:
var Template = Handlebars.Compile(lst);
答案 0 :(得分:2)
您可以将想要的两个元素传递到车把,从原始数据创建一个新数组。(这使您可以完全控制如何选择两个人)
或者您可以尝试为此实现一个处理程序,例如:
Handlebars.registerHelper('list', function(items, len, options) {
var out = "<ul>";
for(var i=0, l=len; i<l; i++) {
out = out + "<li>" + options.fn(items[i]) + "</li>";
}
return out + "</ul>";
});
并像
一样使用它{{#list people 2}}{{firstName}} {{lastName}}{{/list}}
在这里2是您的限制,您可以根据需要更改它
对于C#Handlebars.Net版本,如下所示
var data = new {
people = new [] {
new {
name = "Karen"
},
new {
name = "Kasun"
},
new {
name = "Jon"
}
}
};
string source = @"{{#list 2}}{{name}}{{/list}}";
HandlebarsBlockHelper _listhelper = (TextWriter output, HelperOptions options, dynamic context, object[] arguments) => {
// take 2 as argument in example
int len = Int32.Parse(arguments[0] as string);
output.WriteSafeString("<ul>");
for (int i = 0; i < len; i++) {
output.WriteSafeString("<li>");
// pass name from people object to {{name}}
options.Template(output, context.people[i]);
output.WriteSafeString("</li>");
}
output.WriteSafeString("</ul>");
};
Handlebars.RegisterHelper("list", _listhelper);
var template = Handlebars.Compile(source);
var result = template(data);
C#小提琴:https://dotnetfiddle.net/gUr2VA
希望有帮助。
参考:handlebars