如何访问ember模板中的数组位置?

时间:2015-12-03 16:33:13

标签: javascript ember.js each handlebars.js

我在Ember做一件简单的事情时遇到了一些挫折 我知道所有的混乱来自于从模板中分离逻辑,但我认为我想要实现的并不是那么昂贵。
我有一个模型,它返回一个项目列表,这些项目具有相关属性,并且取决于该属性的值是否重复,模板应该显示或不显示。
我返回的数据应如下所示:

[{id :0,
  text:"Element 0",
  nested_property: {
    value:'Value 1'
  }
},{id :1,
  text:"Element 1",
  nested_property: {
    value:'Value 1'
  }
},{id :2,
  text:"Element 2",
  nested_property: {
    value:'Value 2'
  }
},{id :3,
  text:"Element 3",
  nested_property: {
    value:'Value 2'
  }
},{id :4,
  text:"Element 4",
  nested_property: {
    value:'Value 1'
  }
}]

我想要制作的是这样的:

<ul>
  <li>
    <span>Value 1</span>
    <span>Element 0</span>
  </li>
  <li>
    <span>Element 1</span>
  </li>
  <li>
    <span>Value 2</span>
    <span>Element 2</span>
  </li>
  <li>
    <span>Element 3</span>
  </li>
  <li>
    <span>Value 1</span>
    <span>Element 4</span>
  </li>
</ul>

我的第一个想法是:“好吧,我将实际循环的值保留在变量上,并在下一循环中进行比较。如果不同,则覆盖该值。”
由于我们不能使用“if”来比较两个变量,我必须创建一个组件来做到这一点。这样就解决了部分问题 我现在面临的是如何跟踪最后一个循环值,因为我的组件需要它与实际值进行比较。
我无法使用以下任何选项访问循环内的某个元素:

{{#each model as |element key|}}
    {{model.0.text}}
    {{model[0].text}}
    {{model[key-1].text}} <--- That would be awesome if works :D
{{/each}}

有什么想法?也许是另一种解决问题的方法?

3 个答案:

答案 0 :(得分:2)

如果您想迭代数组模型,那么请执行以下操作:

  {{#each model as |item|}}
    {{index}}
    {{item.text}}
    {{item.nested_property.value}}
  {{/each}}

如果你想获得数组模型的最后一个元素,你可以这样做:

{{model.lastObject}}

如果您想获得数组模型的特定元素,请执行以下操作:

{{get model '2'}}

一切都很简单:) 附:你需要为这个

使用最新的余烬

答案 1 :(得分:1)

非常感谢@Bek的回答,因为它让我走上正轨。我只是为了googlers而在这里写下来 使用第三个选项构成作业的一部分并在ember标签内使用它,它必须在括号之间完成:

{{ log (get model 1) }}

我需要的是访问动态部分和固定字符串的串联以指示对象属性,我不得不使用:

{{ log (get model (concat variable 'fixed.string')) }}

至少,但不是最后......因为我需要在实际位置之前访问位置,所以我应该在其中使用数学运算。并且没有内置帮助器来获取它所以我在Math Ember Helper找到它并且最终代码看起来像这样:

{{#each model as |item index|}}
  {{ log (get model (concat (math key '-' 1) 'nested_property.value')) }}
{{/each}}

答案 2 :(得分:0)

我的建议是在javascript中执行此操作,您可以使用全套工具。

Ember方式的目的是制作一个能够按摩你的数据进行演示的计算器。

binData: Ember.computed('origData', function() {
    let origData = this.get('origData');
    // use Ember collection utilities, lodash, whatever here
    // to bin your data and make it an easy object to loop in hbs
}

现在,您可以在模板中使用binData。并且,由于Ember的魔力,它会在binData执行时更新!