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

当一个项目变脏(或多个项目)时保存模型队列

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 回答