在绑定属性更改时持久化模型
Persisting a model on bound property change
当模型的一个属性绑定到模板输入时,立即持久化模型的最佳实践是什么?在你看来,它属于模型还是控制器?
我想到了这个解决方案,基于一个观察者:
# 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
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- 为集合分配大量的模型弹药
- 如何使用backbone.js从集合中获取模型名称
- 骨干模型默认值-todos.js示例中不必要的代码
- EmberJS中支持单字母单词模型
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- 将不在模型中的数据返回到mvc控制器
- 如何在视图模型contet更新更新上调用Jquery函数
- 如何使用Javascript客户端对象模型检索Sharepoint 2010列表项权限
- 我应该如何检查主干.主干.模型更改时查看
- Ext.js从json构建模型关系的问题
- 显示模块模式在Knockout中设置模型的新实例
- 使用导航属性创建Kendo UI网格模型的问题
- 环回中持久化模型之间的继承
- 如何使用 EmberData 创建非持久化模型
- 如何在angular JS中持久化数据和模型
- 在绑定属性更改时持久化模型
- 使用每个system.acquire获取一个持久化视图模型的新实例
- 分页时的MVC持久化模型
- 如何持久化 AngularJS 模型