0

我需要fetch具有特定 id 的数据,
并且在视图实例中定义了哪个 id。
这里的示例,请参阅 MyModel 定义中的注释:

// my view instance
var myView = new MyView({
    model: {id: 12321}
});

MyView = Backbone.View.extends({
        initialize: function()
        { 
            myModel.fetch();
        }
});

MyModel = Backbone.Model.extends({
        url: function url ()  
        {
          // how to get the id passed to view instance?
          return "http:..../id/" + this.id; 
        }
});
4

1 回答 1

3

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"
});
于 2012-05-13T08:42:50.063 回答