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

Ember.js中this.get("object.value")无法正常工作的原因咨询

问题原因分析:Ember.js中this.get("object.value")返回undefined但this.get("object").value可用

首先明确语法错误问题

你写的this.get("object.value") = undefined本身是JavaScript语法错误——赋值操作的左侧必须是可赋值的引用(比如变量、对象属性),函数调用的返回值不能作为赋值目标,这行代码根本无法执行,和Ember的特性无关。

嵌套属性获取差异的核心原因

当this.get("object.value")返回undefined,但this.get("object").value能正常取值时,核心原因是**object是普通JavaScript对象,而非Ember的响应式对象**(比如Ember.Object实例、Ember Data模型或用@tracked装饰的类属性):

  • Ember的get方法是为响应式对象设计的,它会遵循Ember的属性查找规则(处理计算属性、代理对象等),但对于普通JS对象,get无法正确解析嵌套路径——它只能识别Ember对象上的属性,调用this.get("object.value")时,Ember会先获取object,再尝试用Ember的方式读取该对象的value属性,而普通JS对象没有Ember的属性访问机制,因此返回undefined。
  • 而this.get("object")会直接返回这个普通JS对象,之后用原生JS的.value访问属性,自然能拿到正确的值。

正确写法建议

情况1:使用普通JS对象

如果不需要响应式更新(比如模板不需要随属性变化重新渲染),直接用原生JS赋值即可:

this.get("object").value = "values";

情况2:需要响应式更新

要让属性具备Ember的响应式能力,需将object定义为Ember响应式对象:

传统Ember写法(使用Ember.Object)

// 先初始化响应式对象
this.set("object", Ember.Object.create({ value: "" }));
// 之后可用Ember的get/set操作嵌套属性
this.set("object.value", "values");
console.log(this.get("object.value")); // 正常输出"values"

现代Ember(Octane+)写法(使用@tracked)

import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';

export default class MyComponent extends Component {
  @tracked object = { value: "" };

  updateValue() {
    this.object.value = "values"; // 直接赋值即可触发响应式更新
    console.log(this.object.value); // 正常输出"values"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:18