Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ember.get(';lastObject';)未按预期工作_Javascript_Ember.js - Fatal编程技术网

Javascript Ember.get(';lastObject';)未按预期工作

Javascript Ember.get(';lastObject';)未按预期工作,javascript,ember.js,Javascript,Ember.js,我有一个表单提交给播放控制器上的方法。从提交的表单中,我创建了一个歌曲记录并提交。现在的情况是,所有提交的文件都可以正常工作。将保存并提交新记录。我可以执行App.Song.find()并查看内容是否已更新 但第二份意见书出现了问题。提交实际上是作为新记录提交的,当我转到模型时,我发现它存储了另一个新值。但是,当我尝试在find()上使用.get('lastObject')时,我得到了第一次提交。第三次提交返回第二次提交,依此类推 这是我的密码: // create song in Song

我有一个表单提交给播放控制器上的方法。从提交的表单中,我创建了一个歌曲记录并提交。现在的情况是,所有提交的文件都可以正常工作。将保存并提交新记录。我可以执行App.Song.find()并查看内容是否已更新

但第二份意见书出现了问题。提交实际上是作为新记录提交的,当我转到模型时,我发现它存储了另一个新值。但是,当我尝试在find()上使用.get('lastObject')时,我得到了第一次提交。第三次提交返回第二次提交,依此类推

这是我的密码:

 // create song in Song model first
  new_song = App.Song.createRecord({
    name: 'test name',
    artist: 'test username',
    soundcloud: '/tracks/'
  });

  new_song.get('store').commit();

  //can't return the song ID when commiting, so need to manually find it
  // find all songs, return last result
  last_song = App.Song.find().get('lastObject');
  console.log(last_song);
这里有一个console.log(songs\u array.get('last\u song');输出如下:

Object {id: "ember914", clientId: 30, type: function, data: Object, record: Class}
Object {id: "ember914", clientId: 30, type: function, data: Object, record: Class…}
Object {id: "ember1200", clientId: 31, type: function, data: Object, record: Class…}
Object {id: "ember1408", clientId: 32, type: function, data: Object, record: Class…}

这里的问题是,您试图在创建新歌曲后直接找到它。这将不起作用,因为它是在操作的稍后阶段添加到
find()
数组中的

最明显的解决办法是:

// create song in Song model first
new_song = App.Song.createRecord({
  name: 'test name',
  artist: 'test username',
  soundcloud: '/tracks/'
 });

new_song.get('store').commit();

Em.run.next(function() {
  last_song = App.Song.find().get('lastObject');
});
这里有一个例子来说明这一点

但是需要注意的一点是,当你遇到这样的问题,并且感觉余烬对你不利(特别是当你开始担心运行循环时),这可能意味着你做错了

现在的问题是,为什么要在创建记录后立即用这种方式查找记录

如果您只是想将记录保存在一个变量中,那么您已经将其保存在
new\u song
中了,只需将其传递,稍后它将被id填充。请记住,一旦您以这种方式获得
last\u song
,您将拥有
last\u song==new\u song
,那么获得它的意义何在

如果需要在创建后立即获取ID(这是一种非常罕见的情况),可以执行以下操作:

new_song = App.Song.createRecord({
  name: 'test name',
  artist: 'test username',
  soundcloud: '/tracks/'
});

new_song.one('didCreate', function() {
  Em.run.next(function() {
    console.log(new_song.get('id'));
  });
});

new_song.get('store').commit();

请注意
Em.run。上例中的下一个
是,这只是因为一个bug很快就会被修复。

所以我想要立即录制该唱片的原因是,我可以将其保存到播放列表模型中。诚然,我刚刚开始深入研究跑步循环和余烬数据等更深层次的主题,所以我不确定如何做到这一点。今天晚些时候我会试试这个,等我能用的时候再投票,但这一切都是有意义的,应该能用。谢谢你,泰迪!将其添加到其他模型时不需要Id。您可以执行
playlist.get('songs').pushObject(new\u song)
,或者如果
song
属于一个
playlist
new\u song.set('playlist',playlist)
。当然,你需要在模型定义中定义关系。泰迪,我爱你。最后一条注释非常有用,删除了一堆多余的代码。我最终使用self.get('content').get('songs').pushObject(new_song);(self just being var self=this;在我的播放控制器中。