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
相关产品推荐
相关产品推荐

