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

时间:2013-04-29 02:17:12

标签: javascript ember.js

我有一个表单,提交给我的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…}

1 个答案:

答案 0 :(得分:2)

这里的问题是您在创建后直接尝试查找新创建的歌曲。这不起作用,因为它会在Ember Run Loop的后期添加到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');
});

这是展示它的fiddle

有一点需要注意的是,当你遇到这样的问题时,感觉Ember正在对你不利(特别是当你开始担心Run Loop)时,这可能意味着你做错了。

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

如果您只想将记录保存在变量中,那么您已经在new_song中使用了该记录,只需将其传递给它,稍后将使用该ID填充它。请记住,一旦你以last_song的方式获得last_song === new_song,你就会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(); ,所以获得它的重点是什么......

如果您需要在创建后立即获取ID(这是一种非常罕见的情况),您可以这样做:

Em.run.next

请注意上面例子中的{{1}}是,这只是因为一个很快就会修复的错误。