如何跟踪ember.js中的Em.Store肮脏

时间:2013-03-19 15:51:06

标签: ruby-on-rails transactions ember.js ember-data

我正试图跟踪我的Ember商店中是否存在脏记录。

我希望有一个带有链接属性的“保存”按钮,以便在没有记录等待更新时禁用该按钮。

我想有几种方法可以做到这一点,但我正在寻找正确的“余烬”做事方式。

这里最简单的方法是什么? AFAICS我可以..

  • 每当更改属性时手动设置全局属性 - 并在存储同步到服务器时重置它

  • 我的控制器上有一个属性,该属性是根据商店的内容计算的。我能够这样做,但我发现商店更新时房产没有更新。

...

hasUpdates: function() {
    console.log('hej!')
    return (this.get('store').get('defaultTransaction.buckets.updated.list.length') > 0);
}.property('store')

这必须是一种常见的模式 - 我该怎么做?

编辑:将使用不起作用的内容更新答案

  hasUpdates: function() {
    console.log('hej!');
    return (this.get('store').get('defaultTransaction.buckets.updated.list.length') > 0);
  }.property('store._recordsToSave@each')

2 个答案:

答案 0 :(得分:0)

如果您一次处理一条记录,则始终可以绑定到模型的isDirty属性。我通常在控制器上创建一个名为isClean的计算属性,它是isDirty的否定,然后在模板中

<input type="submit" {{bindAttr disabled="isClean"}}>

答案 1 :(得分:0)

也许这有助于你:

初始化应用

App = Ember.Application.create({});

App.Store = DS.Store.extend({
  adapter: 'DS.FixtureAdapter'
});

DS.Model.reopenClass({
  dirtyItems: function(){
    return this.filter(function(model) { 
      return model.get('isDirty'); 
    }).get('content');
  }
});

App.Product = DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr('string')
});

App.Product.FIXTURES = [{id: 1, name: 'Table'}]

然后尝试

App.Product.dirtyItems(); // -> return []

book = App.Product.createRecord({name: 'Book'});
App.Product.dirtyItems(); // -> return [Object]

book.save()
App.Product.dirtyItems(); // -> return []

skate = App.Product.createRecord({name: 'Skate'});
bike = App.Product.createRecord({name: 'Bike'});
App.Product.dirtyItems(); // -> return [Object, Object]

skate.get('store').save()
App.Product.dirtyItems(); // -> return []