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

Ember Octane中Controller的Tracked数组为何无法在Template渲染?

Ember Octane中tracked数组无法在模板渲染的问题解决

核心原因

Ember的@tracked装饰器默认追踪的是变量的引用变更,不会自动监听数组、对象这类复杂类型内部的元素/属性变更。你调用push方法修改数组内容时,displayedArray本身的内存引用没有发生变化,因此Glimmer响应式系统检测不到变更,不会触发模板重渲染。
另外你测试时写的{{this.displayArray.length}}存在拼写错误,正确变量名是displayedArray,但哪怕修正拼写,也不会因为数组内部内容变化而更新长度数值。

两种可行解决方案

方案1:替换数组引用(轻量场景首选)

每次修改数组后重新赋值为新的数组实例,主动触发@tracked的更新检测,不需要引入额外依赖:

@action
async setUpArray(){
  let object1 = {Key1:[1,2], Key2: [3,4]};
  let object2 = {Key1:[5,6], Key2: [7,8]};
  // 展开旧数组拼接新元素,生成新数组后赋值
  this.displayedArray = [...this.displayedArray, object1, object2];
}

其他数组操作也可以用相同思路处理:删除元素用filter返回新数组、修改元素用map返回新数组后重新赋值即可。

方案2:使用TrackedArray(高频数组操作场景首选)

Ember官方提供了专门的响应式数组类TrackedArray,会自动监听内部元素的增删改操作,不需要每次手动替换引用:
首先导入依赖:

import { TrackedArray } from '@ember/tracking';

初始化时替换原生数组:

@tracked
displayedArray = TrackedArray.from([]);

修改数组的原有push代码不需要调整,直接调用就会自动触发响应式更新。

模板写法修正

你之前的模板调用语法也存在错误,正确写法如下:

  • 取数组下标为0的元素:{{this.displayedArray.[0]}}
  • 渲染所有数组元素建议用each循环:
{{#each this.displayedArray as |item index|}}
  <div>第{{index}}项:Key1值为{{item.Key1}},Key2值为{{item.Key2}}</div>
{{/each}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:06:04