使用 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)
答案 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');
}
}