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

Ember.js模板中如何监听JSON对象变化?问题求助

Ember.js 对象属性变化未触发模板更新的解决方法

问题原因

Ember的@tracked装饰器默认只追踪对象引用的变更。你直接修改testjson的内部属性key1时,对象本身的引用没有改变,因此@tracked无法检测到变化,导致计算属性testJsonChanges不会重新计算,模板也不会刷新显示jsonChange按钮。

解决方案

方案1:替换整个对象(推荐,无需额外依赖)

通过创建新对象替换原有对象,改变引用触发追踪:

@action updateJson() {
  this.testjson = {
    ...this.testjson, // 保留原有其他属性
    key1: 'valuex'
  };
}

方案2:使用TrackedObject(适合频繁修改内部属性的场景)

Ember提供TrackedObject来创建深度追踪的对象,修改内部属性会自动触发更新:
首先导入TrackedObject:

import { TrackedObject } from '@glimmer/tracking';

然后初始化对象:

@tracked testjson = new TrackedObject({key1:'value1', key2:'value2'});

此时你原来的updateJson方法无需修改,直接修改内部属性即可触发更新:

@action updateJson() {
  this.testjson.key1 = 'valuex';
}

方案3:使用set函数(兼容旧版Ember,不推荐新项目使用)

导入set工具函数来修改属性:

import { set } from '@ember/object';

@action updateJson() {
  set(this.testjson, 'key1', 'valuex');
}

修改后的完整代码示例(方案1)

test.js:

import Controller from '@ember/controller';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';

export default class TestController extends Controller {
  @tracked testjson = {key1:'value1', key2:'value2'};
  
  @action updateJson() {
    this.testjson = {
      ...this.testjson,
      key1: 'valuex'
    };
  }
    
  get testJsonChanges() {
    return this.testjson.key1 != 'value1';
  }
}

内容的提问来源于stack exchange,提问作者s.w

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:16:08