【问题标题】:Persisting a model on bound property change在绑定属性更改上保持模型
【发布时间】:2014-09-27 03:54:00
【问题描述】:

当模型的一个属性绑定到模板输入时,立即持久化模型的最佳做法是什么?您认为它属于模型还是控制器?

我根据观察者提出了这个解决方案:

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

【问题讨论】:

    标签: javascript performance ember.js debouncing


    【解决方案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

    【讨论】:

    • 太棒了!顺便说一句,我试图从去抖动调用 (Em.run.debounce(this, this.save, 500);) 中删除 realSave 代理,它似乎工作得很好。我错过了什么吗?
    • 哦,是的,抱歉,我做了两个不同的版本,结果有点老套了。真是太酷了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多