即使我将它存储在DS.Store中,ember find()也会继续进行api调用

时间:2015-04-13 15:06:05

标签: ember.js ember-data

我有一个带有自定义适配器的模型。我有我的适配器填充应用程序商店,但当我的组件调用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()方法。我错过了什么?

2 个答案:

答案 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)

我希望这种模式有意义。