在做findAll之前,清除Ember's Store的数据

时间:2015-08-07 20:23:30

标签: ember.js ember-data

使用 Ember 1.11 我有一个搜索函数工作,将运行参数化的find(),但后来我希望能够返回到find之前的状态,只有之前的记录。在我的应用程序中,这是API返回的记录,没有查询参数。

我的路线模型挂钩

  model: function(params) {
    if (params.q) {
      return this.store.find('project', params);
    } else {
      return this.store.findAll('project');
    }
  }

但是,当前发生的事情是当用户返回时(通过使用清除查询参数的操作):

backToMyProjects: function() {
  this.set('q', null);
}

this jsbin是来自@lolmaus的一个例子,帮助我实现了这个目标) 那么所有记录仍然在商店中,所以当它找到所有()时,它会返回两组记录,当我真正想要它清除商店时,然后使用findAll()中的记录。服务器API调用在两个地方都正确发生,只是在使用params调用之后没有参数调用模型钩子,然后商店中有额外的记录。

然后我尝试添加this.store.unloadAll('project'),但是从参数化查询转到没有参数的查询后出现错误。

更新了模型挂钩

model: function(params) {
  if (params.q) {
    return this.store.find('project', params);
  } else {
    this.store.unloadAll('project');
    return this.store.findAll('project');
  }
},
//this isn't new, just forgot to put it earlier. when the query param is modified, the model hook is called again (as I understand it).
queryParams: {
  q: {
    refreshModel: true
  } 
}

错误消息

Error while processing route: projects Assertion Failed: calling set on destroyed object Error: Assertion Failed: calling set on destroyed object
    at new Error (native)
    at Error.EmberError (http://localhost:4200/assets/vendor.js:22615:21)
    at Object.Ember.default.assert (http://localhost:4200/assets/vendor.js:15716:13)
    at Object.set (http://localhost:4200/assets/vendor.js:26367:22)
    at exports.default.mixin.Mixin.create.set (http://localhost:4200/assets/vendor.js:41034:20)
    at Ember.Object.extend.flushCanonical (http://localhost:4200/assets/vendor.js:69680:14)
    at ember$data$lib$system$relationships$state$has_many$$ManyRelationship.flushCanonical (http://localhost:4200/assets/vendor.js:71436:22)
    at Queue.invoke (http://localhost:4200/assets/vendor.js:11425:18)
    at Object.Queue.flush (http://localhost:4200/assets/vendor.js:11490:13)
    at Object.DeferredActionQueues.flush (http://localhost:4200/assets/vendor.js:11295:19)

1 个答案:

答案 0 :(得分:1)

else条件下,再次使用find()而非findAll()从商店获取所有内容:

return this.store.find('project');

更新:没关系,在1.11及以上,无论如何都会调用findAll()。不知道如何强迫它不使用商店。

到目前为止,我已经将unloadAll()包装在Ember.run中,它似乎可行,但我不确定为什么这是必要的:

  model: function(params) {
    if (params.q) {
      return this.store.find('project', params);
    } else {
      var _this = this;
      Ember.run(function() {
        _this.store.unloadAll('project');
      });
      return this.store.find('project');
    }
  }