让我们在这里分开一些事情
存储缓存
this.store.all('foo').clear();
只是破坏了内部all
过滤直至foo
记录被修改/添加/删除,迫使过滤器重新计算存储中的记录。我这样说是为了表明clear 并没有从 ED 的存储中删除记录。
示例(单击按钮,观看控制台,阅读有趣的操作代码)
http://emberjs.jsbin.com/OxIDiVU/103/edit http://emberjs.jsbin.com/OxIDiVU/103/edit
也就是说,被缓存的不是 ajax,而是被缓存的记录实例(和记录)上的属性/关系。
从存储中删除某种类型的记录的正确方法是store.unloadAll('foo')
普罗米塞兰迪亚
我知道您已经熟悉 Promise,所以这部分可能毫无价值,但是值得记录
异步关系真的很酷,因为它们会返回PromiseObject
/PromiseArray
for belongsTo
/hasMany
. The PromiseObject
/PromiseArray
extend ObjectProxy
/ArrayProxy
(这些是相同的事情ObjectController
/ArrayController
延长)。这本质上给出了PromiseObject
/PromiseArray
代理获取/设置下面模型的属性的能力。在这种情况下,在承诺上发生的设置/获取在承诺得到解决之前不会“工作”(它不会崩溃,只是返回未定义)。 *警告,承诺中不存在方法,因此您不能对承诺调用 save 并期望它起作用。
前任。使用你的模型。
var foo = this.store.find('foo', 1);
var bar = foo.get('bar'); // PromiseObject
bar.get('name'); // undefined
后来,bar已经解决了,bar仍然是PromiseObject
bar.get('name'); // billy
foo 将继续返回 PromiseObject
var bar2 = foo.get('bar'); // PromiseObject
bar2.get('name'); // billy
saving
bar.save(); // Boom no workey
bar.then(function(realBar){
realBar.save(); // workey
});
对于你的情况我有3条建议
构建您自己的承诺,在需要时解决,对所需的记录使用 Ember.RSVP.all (考虑到它们可能尚未解决,因此是异步的)
var self = this;
var promise = new Ember.RSVP.Promise(function(resolve, reject){
self.store.find('foo').then(function(foos) {
Em.RSVP.all(foos.getEach('bar')).then(function(bars){
var filtered = bars.filterBy('name', 'bazz');
resolve(filtered);
});
});
});
return promise;
http://emberjs.jsbin.com/OxIDiVU/104/edit http://emberjs.jsbin.com/OxIDiVU/104/edit
异步属性
很多时候,对于在模型挂钩期间未解析的异步对象/属性(它会阻止 Promise 并等待它们被解析),一个好技巧是设置占位符对象等。
var items = [];
controller.set('model', items);
// promise from above
promise.then(function(records){
items.pushObjects(records.toArray()); // toArray may or may not apply
});
http://emberjs.jsbin.com/OxIDiVU/106/edit http://emberjs.jsbin.com/OxIDiVU/106/edit