0

我有一个提交给我的 PlaylistController 上的方法的表单。从该表单提交中,我创建了一个歌曲记录并提交它。正在发生的事情是所有提交工作正常。一条新记录被保存并提交。我可以执行 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_array.get('last_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…}
4

1 回答 1

2

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

最明显的解决方案是:

// 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');
});

这是一个演示它的小提琴

不过要注意的一件事是,当您遇到此类问题,并且感觉 Ember 对您不利时(尤其是当您开始担心 Run Loop 时),这可能意味着您做错了。

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

如果您只想将记录保存在变量中,那么您已经将其保存在 中new_song,只需将其传递,稍后将使用 id 填充它。请记住,一旦你得到last_song了你的方式,你就会拥有last_song === new_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.next,上面示例中的 是 ,这只是因为很快就会修复一个错误。

于 2013-04-29T11:38:12.427 回答