【发布时间】:2011-09-02 09:38:39
【问题描述】:
我正在使用 Backbone.js 来跟踪可视化应用程序中的状态。
模型具有如下属性:
indicatorX : "income"
indicatorY : "emissions"
indicatorXScale : "lin"
indicatorYScale : "log"
year : 1980
layout : {leftPanel : {[...]}, rightPanel : {[...]}}
1.在 Backbone.js 模型中处理“依赖属性”的好方法是什么?
例如,在更改 indicatorX 属性时,我还希望模型更新 indicatorXScale 属性。
2。如何处理 "lingering" 模型属性?示例:
模型包含这个:
indicatorX : "income"
indicatorXScale : "log"
如果模型上只设置了indicatorX,那么scale应该设置为默认:
model.set( {indicatorX : "emissions"} )
if("indicatorX" in changedAttrs){
indicatorXScale = dataSource[indicatorX].defaultScale
}
如果用户想要在“排放”指标的情况下覆盖默认比例“lin”怎么办?
model.set( {indicatorX : "emissions", indicatorXScale : log} )
由于模型属性indicatorXScale 已经设置为“log”,所以不记录更改的属性。在这种情况下,我如何确保未加载 defaultScale - 而是传递给模型的那个?
3。让模型使用额外的属性“action”来描述模型的变化是个好主意吗?
通过这种方式,控制器可以侦听一个属性,而不是为属性组合指定处理程序。这些是替代方案:
Alt 1. 控制器具有特定属性的处理程序:
this.model.bind("change:year", this.render);
this.model.bind("change:layout", this.updateLayout);
Alt 2. 控制器具有模型更改处理程序,render() 确定要做什么:
this.model.bind("change", this.render);
render() {
var changedAttributes = this.model.changedAttributes
if (a,b && c in changedAttributes) x()
if (a,d in changedAttributes) y()
}
Alt 3. 让模型描述属性变化的组合意味着什么:
this.model.bind("change:action", this.render);
render() {
var changedAttributes = this.model.changedAttributes
var action = this.model.get("action")
if (action == gui_changeIndicator) x()
if (action == gui_opacity) y()
}
4.在 Backbone.js 模型中使用对象作为属性时,有什么需要注意的陷阱吗?
例如,在我试图保留在模型中的布局状态上执行 isEqual 是否昂贵?另外,在设置模型时,对象是通过引用传递的,所以最好是一个新的对象来进行比较?
【问题讨论】:
标签: javascript model-view-controller backbone.js