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