获取具有在视图实例中定义的特定id的数据

时间:2012-05-13 08:29:31

标签: javascript backbone.js

我需要fetch具有特定身份的数据 以及在视图实例中定义的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; 
        }
});

1 个答案:

答案 0 :(得分:3)

模型不应该知道View的存在,因此View应该是模型的id获取的那个:

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

(我已经使用你的示例代码作为我的示例的模板,但我不得不说我觉得它有几个奇怪的东西,我想这只是一个品味问题)

更新:我个人的口味意见

很难做到这一点,但正如您所要求的,我将与您分享我对您的示例代码的个人代码审查。按照原样:非常谦虚的意见。

this.model confused

我不会使用可以产生混淆的属性名称:

var myView = new MyView({
    model: {id: 12321}
});

进入这个实例this.model正在引用原始哈希,但在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();
        }
});

我更喜欢使用更多封装的范围,即使在View的外部上下文中声明了myModel,View也应该使用其私有上下文的变量。例如

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全局变量。

使用Backbone 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"
});