Ember.js 刷新时,Ember localstorage适配器具有不同的数据
我对Ember比较陌生,一直在努力构建一个简单的CRUD应用程序来进行学习。我正在使用localstorage适配器模拟后端。我的调试非常糟糕,因为Ember Inspector在不同的页面上显示不同的数据 现在我有完整的CRUD功能,除了更新。假设我创建了一首新歌曲(S1),它是专辑(A1)的一部分。我可以将S1更改为属于另一个相册(A2),这样即使我刷新,也可以保存并保存在本地存储中 现在,如果我决定将S1的相册更改回A1,它将保存并显示在显示页面上,但如果我刷新,相册将恢复为A2。如果我转到编辑页面,S1的相册将列为A2。如果我在编辑页面上刷新,它将更改为A1,但即使我单击“保存”,它也将在显示页面上显示A1,但如果我刷新或返回编辑,它将返回A2。。。我觉得这特别奇怪,因为它在最初的编辑尝试中确实正确地保存了(并通过重新加载页面保持)。未正确保存的后续编辑尝试 歌曲有一个标题,属于专辑 歌曲控制器Ember.js 刷新时,Ember localstorage适配器具有不同的数据,ember.js,local-storage,ember-data,Ember.js,Local Storage,Ember Data,我对Ember比较陌生,一直在努力构建一个简单的CRUD应用程序来进行学习。我正在使用localstorage适配器模拟后端。我的调试非常糟糕,因为Ember Inspector在不同的页面上显示不同的数据 现在我有完整的CRUD功能,除了更新。假设我创建了一首新歌曲(S1),它是专辑(A1)的一部分。我可以将S1更改为属于另一个相册(A2),这样即使我刷新,也可以保存并保存在本地存储中 现在,如果我决定将S1的相册更改回A1,它将保存并显示在显示页面上,但如果我刷新,相册将恢复为A2。如果我转
import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
updateValue(value) {
this.set('model.song.newAlbum', value)
},
updateSong(model) {
this.store.findRecord('song', model.get('id'))
.then(song => {
if (song.get('newAlbum')) {
this.store.findRecord('album', song.get('newAlbum'))
.then(album => {
song.set('album', album);
album.save();
})
}
song.save();
})
.then(() => this.transitionToRoute('songs.show', model.get('id')));
}
}
});
为了确保数据在后端(即本项目中的本地存储)上正确持久,您需要对关系进行更多的管理 您需要:
song.Set('album',newAlbum)
oldAlbum.songs中删除歌曲
song.album
属性保留到后端newAlbum.songs
保存到后端另外,请记住,您可以从开发人员工具中剪切和粘贴本地存储内容,以帮助调试其中的内容,而不是Ember缓存。要确保数据在后端(即本项目中的本地存储)正确保存,您需要对关系进行更多的管理 您需要:
song.Set('album',newAlbum)
oldAlbum.songs中删除歌曲
song.album
属性保留到后端newAlbum.songs
保存到后端另外,请记住,您可以从开发人员工具中剪切和粘贴本地存储内容,以帮助调试其中的内容与Ember缓存中的内容。进一步说明问题:当我在不同页面上刷新时,数据会发生更改。如果我转到主页,空缓存+硬重新加载,数据看起来是正确的。S1属于A1。如果我随后导航到S1的编辑页面或A2的显示页面,数据会发生变化,S1现在属于A2。这会导致我的应用程序出现许多其他问题。例如,如果我将内容四处移动,然后在某个点上删除,某个页面将中断,因为它试图为不存在的内容获取数据记录(该记录不应再与存在关系)。如果使用catch()将错误处理程序添加到save()调用中,是否会显示更多信息?我在console.log中添加了一个catch来记录错误,但没有记录任何内容。为了进一步说明问题:当我刷新不同的页面时,数据会发生变化。如果我转到主页,空缓存+硬重新加载,数据看起来是正确的。S1属于A1。如果我随后导航到S1的编辑页面或A2的显示页面,数据会发生变化,S1现在属于A2。这会导致我的应用程序出现许多其他问题。例如,如果我将内容四处移动,然后在某个点上删除,某个页面将中断,因为它试图为不存在的内容获取数据记录(该记录不应再与存在关系)。如果使用catch()将错误处理程序添加到save()调用中,是否会显示更多信息?我在console.log中添加了一个catch,但没有记录任何错误。当我将我的函数更改为与您的函数类似并尝试进行编辑时,我收到一个错误,上面写着“错误:断言失败:找不到路由ag4g9”,其中ag4g9是我正在编辑的歌曲的id。出于某种原因,艺术家被删除了?它似乎仍然存在于本地存储中,但不存在于Ember Inspector中的数据中(取决于页面)。非常感谢你的帮助!在我看来,这可能是路由转换的一个问题,但如果没有看到更多的代码或运行一个运行最少的示例,很难说什么。你有没有可能在github上发布你的项目?当然有。事实上,我是作为一个编码挑战来进行这项工作的,并且已经提交了它。也就是说,它不能正常工作这一事实让我发疯,我仍然想找出我自己的错误。非常感谢您发布github链接!我能够让项目运行并发现问题。在苏
import Ember from 'ember';
export default Ember.Route.extend({
model(params) {
return Ember.RSVP.hash({
song: this.store.findRecord('song', params.song_id),
albums: this.store.findAll('album')
})
},
actions: {
updateSong(song) {
if (song.get('newAlbum')) {
// Get the current album's Ember object as 'oldAlbum'
song.get('album').then((oldAlbum) => {
// Then get the new album's Ember object as 'newAlbum'
this.store.findRecord('album', song.get('newAlbum')).then(newAlbum => {
// Set the song's album to the new album
song.set('album', newAlbum);
if (oldAlbum) {
// Save the old album if it exists
oldAlbum.save();
}
// Save the new album
newAlbum.save();
// Save the song
song.save().then(() => {
// Then transition to new route
this.transitionTo('songs.show', song.get('id'))
})
})
});
}
}
}
});