28

所以这是我数据的一般要点(复制了 chrome webkit 检查器的外观)。

> Object
  > Fruit: Array[2]
    > 0: Object
       name: "banana"
       color: "yellow"
       animalthateats: "monkey"
       id: 39480
    > 1: Object
    length: 2
  > Vegetables: Array[179]
  > Dairy: Array[2]
  > Meat: Array[3]
  > __proto__: Object

这就是我想要做的(一般来说):

<select>
  <option value="">All Shows (default)</option>
  <optgroup label="Fruit">
    <option value="39480">Banana</option>
    <option value="43432">Strawberry</option>
  </optgroup>
  <optgroup label="Vegetables">
    <option value="3432">Broccoli</option>
  </optgroup>
</select>

我对整个模板化的东西有点陌生,而且完成起来肯定看起来很不简单……如果我无论如何都可以使用 jQuery,那也可以,但最好只使用这个设置。

4

5 回答 5

16

只使用“这个”

`<script id="some-template" type="text/x-handlebars-template">
<option value="none">Selec</option>
{{#each data}}
    <optgroup label="{{@key}}">
    {{#each this}}
        <option value="{{id}}">{{name}}</option>
    {{/each}}
    </optgroup>
{{/each}}
</script>`

http://jsfiddle.net/rcondori/jfav4o6u/

于 2014-12-22T16:37:56.710 回答
11

您当前的数据格式给您带来了两个问题:

  1. Handlebars 真的想遍历数组,而不是对象。
  2. JavaScript 对象没有可靠的顺序。

如果您可以将数据重新排列为嵌套数组,您将会有更好的运气,如下所示:

var foods  = { /* what you already have */ };
var for_hb = [
        { name: 'Fruit',      foods: foods.Fruit },
        { name: 'Vegetables', foods: foods.Vegetables },
        //...
];

你可以用这样简单的东西来做到这一点:

var for_hb = [ ];
for(var k in foods)
    for_hb.push({name: k, foods: foods[k]});
for_hb.sort(function(a, b) {
    a = a.name.toLowerCase();
    b = b.name.toLowerCase();
    return a < b ? -1
         : a > b ? +1
         :          0;
});

var html = compiled_template({ groups: for_hb });

那么你的模板很简单:

<select>
  <option value="">All Shows (default)</option>
  {{#each group}}
    <optgroup label="{{name}}">
    {{#each foods}}
      <option value="{{id}}">{{name}}</option>
    {{/each}}
  {{/each}}
</select>

您可以编写一个帮助程序来迭代一个对象,但如果您想确定一个合理的显示顺序,您仍然必须指定数组中的键。

于 2012-09-14T03:47:02.187 回答
1

您可以通过自定义组件执行此操作,请参见示例,我们的默认助手不支持此操作{{each}}(这是有意的)。

样本数据:

a = {a:'muhammad', b :'asif', c: 'javed', username: 'maxifjaved'}

**

迭代抛出对象的在线演示

http://emberjs.jsbin.com/yuheke/1/edit?html,js,输出

**

于 2016-07-14T06:38:37.387 回答
0

我更像是一个胡子男人:-{)

但是从这里的文档看来,这种事情会做到:

<select>
  <option value="">All Shows (default)</option>
  <optgroup label="Fruit">
    {{#each Fruit}}
    <option value="{{id}}">{{name}}</option>
    {{/each}}
  </optgroup>
  <!-- repeat for others-->
</select>
于 2012-09-13T23:50:35.703 回答
0

至于 Handlebars-only 解决方案,我已经实现了这个逻辑:

{{#each Listings}} 

<a href="javascript:void(0)" title="" ><img src="    {{DefaultImage}}" alt=" {{Make}} {{Model}}" /> </a>
于 2015-11-21T14:20:58.560 回答