Backbone中的计算属性
Computed properties in Backbone
我有一个场景,在这个场景中,客户端上操作的数据以与服务器上不同的方式呈现和交互。
考虑从服务器返回的以下event
资源。
{
"id": 123,
"start_at": 1331336004906,
"end_at": 1331337704906
}
和以下模板进行编辑:
<form>
<!-- Notice how date and time are separated in the interface -->
<input type="text" name="start_date" value="{{start_date}}" />
<input type="text" name="start_time" value="{{start_time}}" />
<!-- Instead of asking for an end date/time, we ask for the duration -->
<input type="text" name="duration" value="{{duration}}" />
<input type="submit" />
</form>
在不将start_date
、start_time
和duration
发送到服务器的情况下,如何将它们视为骨干模型中的属性?我应该修改.toJSON()
吗?
我使用initialize()函数与更改事件监听器的组合来更新派生属性。这个想法首先是在模型初始化时计算属性,其次是让模型倾听自己的变化并相应地更新属性。
我的解决方案大致如下:
MyModel: Backbone.Model.extend({
initialize: function() {
this.updateDerivedAttributes();
this.on('change:start_at', this.updateDerivedAttributes, this);
},
updateDerivedAttributes: function() {
this.set({
start_date: Utils.dateFromDate( this.get( "start_at" ) ),
start_time: Utils.timeFromDate( this.get( "start_at" ) ),
duration: Utils.youGetTheIdea()
}, {silent:true});
}
});
我们非常习惯于将model.toJSON()
发送到馈送模板。这种方法很难覆盖,因为其他组件都在使用它。
但是,我们可以使用自定义的model.toJSONDecorated()
方法为模板提供如下内容:
# in your Backbone.Model
toJSONDecorated: function(){
return
_.extend(
this.toJSON(),
{
start_date : Utils.dateFromDate( this.get( "start_at" ) ),
start_time : Utils.timeFromDate( this.get( "start_at" ) ),
duration : Utils.youGetTheIdea( :) )
}
);
}
当然,这打破了一些模式,我可以接受,如果你不这样做,你可以把这个逻辑转移到Decorator
类,就像人们在其他答案中建议的那样。
您有一些选项:
-
覆盖
toJSON
以返回计算的duration
-
在主干
Model
上创建一个duration()
方法。唯一的缺点是你必须用不同的方式来称呼它(obj.duration()
而不是obj.get('duration')
)。在将obj.toJSON()
交给模板的视图中,混合duration
属性 -
使用https://github.com/asciidisco/Backbone.Mutators(或类似的)创建持续时间的派生getter
您的模型应该与服务器端的模型尽可能接近。所以坚持使用start_at
和end_at
。这将大大简化您的sync()
操作。
在编辑表单的视图上,您可以:
- 通过简单的函数计算
start_date
、start_time
、duration
,并在模板中调用它们 - 提交时转换为
start_at
和end_at
- 如何在自定义指令中获取计算的属性
- Ember服务在注入组件并在计算属性中使用后是未定义的
- 如何计算一个对象中五个属性中有多少是非null的
- 使用javascript动态计算top属性
- 如何递归地计算它在对象中出现的目标键(属性)的数量
- Ember.js:未在组件'中渲染的模型的计算属性;关于变更的参考
- 升级到Ember 1.0计算属性在视图中不再有效
- ES6非结构化中的计算属性-非结构化整体对象
- 在Ember中,can服务具有计算属性
- Tracker重新计算函数出现异常:无法读取属性'0'的未定义
- 计算数组中多个对象的属性
- Ember.js数组控制器计算属性的复选框
- 在ember.js中访问模型之外的计算属性
- Vue.js在计算属性中设置值
- 如何根据其他属性计算对象文字中的对象属性
- 为特定属性计算JSON对象的长度
- 在JavaScript中作为对象属性计算函数
- Javascript:根据属性计算产品变体的数量
- 使用td属性计算乘积之和
- 对每个调用执行JavaScript属性计算