Model 不应该知道 View 的存在,所以 View 应该是id
要获取的 Model 的那个:
MyView = Backbone.View.extends({
initialize: function()
{
myModel.id = this.model.id;
myModel.fetch();
}
});
(我已经使用你的示例代码作为我的示例的模板,但我不得不说我觉得它有一些奇怪的东西,我想只是一个品味问题)
更新:我非常个人的口味意见
这样做非常困难,但根据您的要求,我将与您分享我对您的示例代码的非常个人的代码审查。照原样接受:一个非常谦虚的意见。
this.model 困惑
我不会使用会造成混乱的属性名称:
var myView = new MyView({
model: {id: 12321}
});
在这个实例this.model
中引用了一个原始的Hash,但是在 Backbone 上下文中,这违背了直觉认为这将是一个Backbone.Model。
我宁愿把它改成这样:
var MyView = Backbone.View.extend({
initialize: function( opts ){
this.model_id = opts.model_id;
}
})
var myView = new MyView({ model_id: 12321 });
我觉得这个命名更直观。
关闭变量范围
此代码仅myModel
在其范围大于应有的范围内时才有效:
MyView = Backbone.View.extends({
initialize: function()
{
myModel.fetch();
}
});
我更喜欢使用更多封装的范围,即使myModel
已在视图的外部上下文中声明,视图也应使用其私有上下文的变量。例如
var MyView = Backbone.View.extends({
initialize: function( opts ) {
this.model = opts.model;
this.model.fetch();
}
});
var myView = new MyView({ model: myModel });
检查我var
前面添加的细节,MyView
因为如果不是,MyView
它将是一个window
全局变量。
使用主干 urlRoot
在您的示例中,这...
MyModel = Backbone.Model.extends({
url: function url ()
{
// how to get the id passed to view instance?
return "http:..../id/" + this.id;
}
});
...可以概括为:
MyModel = Backbone.Model.extends({
urlRoot: "http:..../id"
});