在查找操作之间清理存储

时间:2013-08-11 23:03:33

标签: ember.js ember-data

假设我做了以下请求:

App.Phones.find({'country' : 'DE'});

我的后端回复了一些电话号码。现在我做:

App.Phones.find({'country' : 'ES'});

现在我收到其他电话号码。但是:

App.Phones.all();

累积了“旧”数字和新数字。是否有可能在寻呼之间清理商店?怎么样?

我尝试使用App.Phones.clean();但没有成功(has no method 'clean'

修改

这很奇怪但是:在对象上调用record.destroy();(如直觉像素所示)不会将其从商店中删除,只会将其标记为destroyed=true。这意味着,下拉列表仍然显示该选项。实际上,走过记录(all())表明记录在被销毁后仍然存在。也许Ember最终会将它们从商店中移除,但这对我没有任何帮助:因为我的选择被绑定到all(),我现在需要删除它们。

更糟糕的是:由于对象在那里但已被破坏,因此选择显示它,但它不允许选择它!

我可以想到一个非常丑陋的黑客,我创建了一个带有过滤记录的Ember.A(删除destroy ed记录),如下所示:

  1. 销毁所有记录(旧记录)
  2. 从后端请求新记录
  3. 收到记录(.then)后,浏览商店(.all())中的记录,即已销毁的记录和新记录。
  4. 添加数组中不是destroy ed
  5. 的记录
  6. 将select绑定到此已过滤的数组。
  7. 这看起来非常难看,我很惊讶Ember无法完全可靠地清理商店以获取某种记录类型。

2 个答案:

答案 0 :(得分:0)

我想您可以执行以下操作清理商店保存的Phones记录:

App.Phones.find({}); //this will invalidate your cache

但显然这会产生一个新请求,检索所有电话号码。

根据您要实现的目标,您可以在应用程序路由中使用find(),然后在其他路由中使用all()filter()来仅检索DEES等。换句话说,没有这样的方法可以执行以下操作:App.Phones.clean()

更新

另一种(手动)我可以想到从缓存中删除一种类型的记录的方法可能是逐个删除它们find()操作,例如创建一个简单的实用函数,其中包含以下内容代码,并将其称为beetwen您对find()的调用:

App.Phones.all().forEach(function(record) {
  record.destroy();
});

希望它有所帮助。

答案 1 :(得分:0)

所以,这是我提出的(不满意,丑陋,hacky,非直观)代码。它正在做这项工作,但我对此感到非常不满:

getNewPhones : function (countryCode, subtype, city) {
    // Mark old records as destroyed
    App.Availablephone.all().forEach(function(phone, index) {
        phone.destroy();
        console.log('Destroyed phone %o', phone);
    });
    // Not possible to set the availablePhones to .all(), because old records are still there
    //App.Availablephone.find({country : countryCode, subtype : subtype, city : city});
    //this.set('availablePhones', App.Availablephone.all());
    // So, hack is in order:
    //   1. request new data
    //   2. filter all records to just get the newly received ones (!!!)
    var _this = this;
    App.Availablephone.find({country : countryCode, subtype : subtype, city : city}).then(function(recordArray) {
        var availablePhones = Ember.A();
        App.Availablephone.all().forEach(function(phone, index) {
            if(!phone.isDestroyed) {
                console.log('Adding phone=%o', phone);
                availablePhones.push(phone);
            }
        });
        _this.set('availablePhones', availablePhones);
    });
},

非常欢迎评论/批评/改进建议!