我有一个带有自定义适配器的模型。我有我的适配器填充应用程序商店,但当我的组件调用find('model')
时它会执行另一个服务器请求 - 我不想要。文档说如果在商店中记录了某些内容,那么它将从缓存中获取。
SongAdapter = ApplicationAdapter.extent
data = somePayload
new Ember.RSVP.Promise (resolve, reject) =>
path = 'some/endpoint/songs'
myPOST(path, data, @, options).then (data) ->
_.each data.songs, (entity) ->
entity.id = entity.songId
store.push('song', store.normalize('song', entity))
Ember.run(null, resolve, data)
, (jqXHR) ->
jqXHR.then = null
Ember.run(null, reject, jqXHR)
当我的组件加载时,我会像这样获取初始歌曲:
getSongHistory: Ember.on 'didInsertElement', ->
@store.find('song').then (data) =>
@set('songHistory', data.get('content'))
我错过了什么。我认为find()
应该首先搜索缓存,然后如果空委托适配器中的findAll()
方法。我错过了什么?
答案 0 :(得分:1)
假设您使用的是Ember数据:
如果您查看find
here的代码,可以看到当您使用一个参数(在您的情况下为store.find('song')
)调用它时,它会委托给findAll
}然后委托给fetchAll
,其中声明:
/**
This method returns a fresh collection from the server, regardless of if there is already records
in the store or not.
@method fetchAll
@param {String or subclass of DS.Model} type
@return {Promise} promise
*/
find
文档有点误导,应该更改。
答案 1 :(得分:1)
find()
委托给适配器findAll()
方法,该方法将始终发出请求。所以我的解决方案是首先检查商店是否包含任何记录。如果没有,则拨打find()
。 如果有记录,请使用all()
- 无法提出网络请求 - 并将数据设置为组件中的数组。
getSongHistory: Ember.on 'didInsertElement', ->
if @store.all('song').content.length is 0
@store.find('song').then (data) =>
@set('songHistory', data.get('content'))
else
@set('songHistory', @store.all('song').content)
我希望这种模式有意义。