You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Ember.js 2.13的HBS模板中声明并递增变量替代硬编码值

在Ember 2.13的HBS模板中遍历数组元素替代硬编码索引

问题原因

你尝试用{{#let}}定义变量并递增的方式行不通,是因为Ember 2.13的{{#let}}仅用于创建不可变的块级作用域变量,模板本身不支持声明可修改的变量——Ember模板是声明式的,可变状态的处理应该放在组件/控制器中,而非模板内。

最优解决方案:直接遍历数组

既然你需要处理myArray中的元素,最简洁的方式是先用{{#each}}遍历整个数组,再对每个元素用{{#each-in}}遍历其键值对,完全避免硬编码索引:

{{#each myArray as |arrayItem|}}
  {{#each-in arrayItem as |key value|}}
    <th>{{value}}</th>
  {{/each-in}}
{{/each}}

如果只需要处理数组的前两个元素(对应你原代码中的myArray.[0]和myArray.[1]),可以在控制器中定义一个计算属性来过滤数据,保持模板的简洁性:

控制器代码(app/controllers/你的控制器名.js)

import Ember from 'ember';

export default Ember.Controller.extend({
  // 过滤出myArray的前两个元素
  filteredMyArray: Ember.computed('myArray', function() {
    const array = this.get('myArray');
    return array ? array.slice(0, 2) : [];
  })
});

模板代码

{{#each filteredMyArray as |arrayItem|}}
  {{#each-in arrayItem as |key value|}}
    <th>{{value}}</th>
  {{/each-in}}
{{/each}}

如需追踪索引值

如果业务逻辑需要用到元素的索引,可以直接从{{#each}}中获取索引变量:

{{#each myArray as |arrayItem index|}}
  <!-- 这里可以直接使用index变量,比如判断是否是前两个元素 -->
  {{#if (or (eq index 0) (eq index 1))}}
    {{#each-in arrayItem as |key value|}}
      <th>{{value}}</th>
    {{/each-in}}
  {{/if}}
{{/each}}

注意:Ember 2.13中需要安装ember-truth-helpers插件才能使用eq、or这类逻辑助手。

内容的提问来源于stack exchange,提问作者user21299219

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:07:50