【问题标题】:Ember Data: Uncaught TypeError: Cannot read property 'push' of undefinedEmber 数据:未捕获的类型错误:无法读取未定义的属性“推送”
【发布时间】:2015-10-20 11:12:18
【问题描述】:

我是 Ember CLI 的新手,我一直在尝试在创建后将数据推送到 hasMany 关系,但我收到了这个奇怪的错误 Uncaught TypeError: Cannot read property 'push' of undefined 一切似乎都是很好 this.store.createRecord() 正在工作,但 .findRecord .push .peekRecord 不工作。

我的控制器

var VideoToAdd = this.store.find('video', this.get('ActiveCanvas'));
console.log(this.get('ActiveCanvas'));
VideoToAdd.get('hotspots').push(newHotspot);

视频模型

import DS from 'ember-data';

export default DS.Model.extend({
  title: DS.attr(),
  file: DS.attr(),
  hotspots: DS.hasMany('hotspot')
});

热点模型:

import DS from 'ember-data';

export default DS.Model.extend({
  title: DS.attr(),
  onVideo: DS.belongsTo('video'),
  toVideo: DS.attr()
});

请告诉我出了什么问题。

【问题讨论】:

  • 我想你想要VideoToAdd.get('hotspots').addObject(newHotspot),或者.addObjects,如果它是一个热点数组的话。您也可以使用.pushObject.pushObjects,但使用'add' 将检查以确保数组中不存在该记录,因此更安全一些。

标签: ember.js ember-data ember-cli


【解决方案1】:

store 的find 方法是一个异步方法,它返回一个promise(实际上是一个promise 对象)。当您致电VideoToAdd.get('hotspots') 时,您会得到未定义,因为承诺尚未解决;数据根本不存在。如果你等到承诺解决,你会没事的。

this.store.find('video', this.get('ActiveCanvas')).then(function(VideoToAdd) {
    VideoToAdd.get('hotspots').pushObject(newHotspot);
});

为了呼应 Tom Netzband 在 cmets 中所说的话,您需要使用 Ember 友好的方法将对象添加到数组中。 pushObjectaddObject 应该可以工作。

【讨论】:

  • 啊,完全没有注意到这方面的承诺。很好的收获。
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 2020-07-25
  • 2020-08-23
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多