限制handlebar.js的循环

时间:2019-02-11 11:33:18

标签: c# angular handlebars.js

如果我们具有以下上下文:

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#传递people对象,例如:

 var Template = Handlebars.Compile(lst);

1 个答案:

答案 0 :(得分:2)

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

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

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#小提琴:https://dotnetfiddle.net/gUr2VA

希望有帮助。

参考:handlebars