在绑定属性更改时持久化模型

Persisting a model on bound property change

本文关键字:持久化 模型 绑定 属性      更新时间:2023-09-26

当模型的一个属性绑定到模板输入时,立即持久化模型的最佳实践是什么?在你看来,它属于模型还是控制器?

我想到了这个解决方案,基于一个观察者:

# 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运行循环的理解不够深入。

它所属的位置取决于您是否希望模型在更改时保存,或者仅在从特定视图更改时保存。如果你想要模型总是保存,不管它保存在哪里,在模型上做。如果你想控制保存它从一个特定的视图在控制器中做。

解封将是我最喜欢的解决多次调用问题的选项。观看一个特定的项目,然后自动保存时,它的变化。你也可以观察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