1

モデルの属性の 1 つがテンプレート入力にバインドされている場合、モデルをすぐに永続化するためのベスト プラクティスは何ですか? あなたの意見では、それはモデルまたはコントローラーに属していますか?

オブザーバーに基づいて、このソリューションを思いつきました。

# Models
App.Foo = DS.Model.extend
  bars: DS.hasMany('bars')

App.Bar = DS.Model.extend
  quantity: DS.attr('number')

# Template
{{#each bar in bars}}
  {{input value=bar.quantity}}
{{/each}}

# Controller
persistQuantity: ( ->
  @get('bars').forEach (bar) -> bar.save() if bar.get('isDirty')
).observes('bars.@each.quantity')

しかし、これにより、何らかの理由で同じモデルに対して複数 (私にとっては 3 つ) の保存要求が発生します。

また、モデルにオブザーバーを配置しようとしましたが、これは無限ループに陥りました。

# App.Bar Model
  persistQuantity: ( ->
    @save()
  ).observes('quantity')

で修正しようとしましたEmber.run.onceが、Ember の実行ループについての理解が不十分だったようです。

4

1 に答える 1

1

モデルが属する場所は、モデルが変更されるたびに保存するか、特定のビューから変更されたときにのみ保存するかによって異なります。保存場所に関係なく、モデルを常に保存する場合は、モデルで行います。特定のビューからの保存を制御したい場合は、コントローラーで行います。

デバウンスは、複数の呼び出しの問題を解決するための私のお気に入りのオプションです。特定のアイテムを監視し、変更時に自動的に保存します。変更を監視して起動することもできますがisDirty、私は他のパターンのファンです (isDirty の方が優れていますが、情報量は少なくなります)。ここに両方の​​パターンがあります。必要に応じて自由に組み合わせてください。

汚れたときにモデルを自動保存する:

App.Bar = DS.Model.extend
  quantity: DS.attr('number'),
  watchDirty: function(){
    if(this.get('isDirty')){
      this.save();
    }
  }.observes('isDirty')

例: http://emberjs.jsbin.com/OxIDiVU/898/edit

1 つのアイテム (または複数のアイテム) がダーティになったときにモデル キューを保存する

App.Bar = DS.Model.extend({
    quantity: DS.attr(),  
    watchQuantity: function(){
      if(this.get('isDirty')){
        Em.run.debounce(this, this.save, 500); 
      }
    }.observes('quantity')
});

例: http://emberjs.jsbin.com/OxIDiVU/897/edit

于 2014-08-04T16:40:09.363 に答える