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

Ember Component赋值Map后调用this.get返回undefined问题求助

问题原因
  • 核心原因是你没有在init方法开头调用父类的this._super(...arguments),Ember.Component的初始化流程依赖父类init的执行,未调用的情况下实例属性的状态没有完成初始化,此时执行set操作不会正常挂载属性到实例上,后续get就会返回undefined。
  • 次要排查点:如果你的console.log执行时机早于init内的set操作,也会拿到undefined。
  • 低版本Ember兼容性问题:Ember 2.x及更早版本对原生JS Map的set/get追踪支持不完善,也可能出现取值异常。
解决方案
  1. 优先修复init方法,首行必须调用父类初始化逻辑:
const SubscriptionForm = Ember.Component.extend({
  messagesFilter: Ember.Map.create(),
  
  init() {
    // 必须放在init第一行
    this._super(...arguments);
    this.set('messagesFilter', this.getMessagesFilter());
    // 此时打印即可拿到正确值
    console.log(this.get('messagesFilter'));
  },
  // 其余代码保持不变
})
  1. 如果使用Ember 2.x及更低版本,建议统一使用Ember内置的Ember.Map避免兼容性问题,修改getMessagesFilter的实现:
getMessagesFilter() {
  let map = Ember.Map.create();
  const availableMessages = this.get('availableMessages');
  for (var i = 0; i < availableMessages.length; i++){
    let array = [];
    map.set(availableMessages.objectAt(i), array);
  }
  return map;
}
  1. 确认所有读取messagesFilter的操作都在组件init执行完成后触发,不要在早于init的生命周期阶段读取该属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:36:03