我有一个表单,提交给我的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…}
答案 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}}是,这只是因为一个很快就会修复的错误。