限制把手的循环

Limit the loop for handlebarjs

如果我们有以下上下文:

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 个人(如果可能,还希望从列表中随机选择个人),而不是遍历整个数组。

参考:http://handlebarsjs.com

更新:

我正在使用 Handebars.Net 参考:https://github.com/rexm/Handlebars.Net

实际上我正在传递来自 c# 的人员对象,例如:

 var Template = Handlebars.Compile(lst);

您可以将两个您想要的元素传递给车把,从您的原始数据创建一个新数组。(这使您可以完全控制如何 select 两个人)

或者您可以尝试为此实现一个处理程序,例如:

Javascript

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#

对于 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# Fiddle : https://dotnetfiddle.net/gUr2VA

希望对您有所帮助。

参考:handlebars