升级underscore.js打破了backbone.js

时间:2012-03-15 15:53:32

标签: javascript jquery-mobile backbone.js underscore.js

我有一个Web应用程序,当前正在使用backbone.js 0.5.3,其中包含主干本地存储适配器1,underscore.js 1.2.2和jquery mobile 1.0.1。 我想升级我的骨干版本和下划线,但是当我升级我的下划线版本(1.2.2到1.3.1)时,我在backbone.js中遇到错误(我将详细说明下面的错误)。我尝试升级下划线并升级下划线和backbone.js,我仍然得到错误。我没有看到下划线的更改日志中有任何重大变化,但也许我错过了一些东西。

以下是我在backbone.js中获取的javascript错误的详细信息,错误消息是“this.model不是构造函数”在firebug中或“未捕获TypeError:undefined不是函数”在chrome中。在backbone.collection的_prepareModel方法中抛出错误,该方法由其add方法调用,该方法基于我的代码中的提取调用(从本地存储而不是服务器提取)触发。我能看到的是“模型”在方法中是未定义的(我认为它应该是一个函数),这就是它抛出错误的原因,我只是不太清楚该怎么做。

这是_prepareModel方法的代码

    _prepareModel: function(model, options) {
  if (!(model instanceof Backbone.Model)) {
    var attrs = model;
    options.collection = this;
    model = new this.model(attrs, options);
    if (!model._validate(model.attributes, options)) model = false;
  } else if (!model.collection) {
    model.collection = this;
  }
  return model;
},

我真的没有太多可以发布的自己的代码,因为我只是在集合上调用fetch。

由于

修改

这里有一些代码可以重现我正在谈论的问题。如果我使用underscore.js版本1.2.2它工作正常,如果我交换1.3.1它会抛出错误。

var YM = YM || {};
YM.Holidays = YM.Holidays || {};

YM.Holidays = {

Holiday: Backbone.Model.extend({
    fDate: null,
    Description: null,
}),

HolidayView: Backbone.View.extend({

    tagName: 'li',

holidayTemplate: null,

initialize: function () {
    this.holidayTemplate = _.template($('#holiday-template').html());
},

render: function () {
    $(this.el).html(this.holidayTemplate(this.model.toJSON()));
    return this;
 },
}),

Holidays: Backbone.Collection.extend({
   model: YM.Holidays.Holiday
}),

HolidayListView: Backbone.View.extend({

el: 'body',

initialize: function () {
    this.collection = YM.holidays;
},

render: function () {
    var $holidayList = $('#ulHolidays');
    _.each(this.collection.models, function (holiday) {
        var view = new YM.Holidays.HolidayView({  model: holiday});
        $holidayList.append(view.render().el);
    }, this); 
 }
})

};


$(function () {

var holidays = [ {fDate: '1/1/2012', Description: 'New Years'}
                        , {fDate: '1/16/2012', Description: 'ML King Day'}
                        , {fDate: '2/20/2012', Description: 'Presidents Day'}];
 YM.holidays = new YM.Holidays.Holidays();
 YM.holidayListView = new YM.Holidays.HolidayListView();
 YM.holidays.add(holidays);
 YM.holidayListView.render();
 });

编辑2

它有点奇怪,似乎这个问题与jquery mobile有某种关系,我打算再研究一下。与此同时,这里有两个jsfiddles,它们之间的唯一区别是它们使用哪种版本的下划线。

http://jsfiddle.net/KDMcd/ - 强调1.2.2的作品 http://jsfiddle.net/hnGAA/ -underscore 1.3.1不起作用

编辑3

谢谢,这在我的测试示例中有效,我将在我的实际项目中尝试。您是否知道为什么有必要在以后明确设置模型?因为我这样做的方式似乎是根据文档完成的方式。还有任何想法改变了下划线,现在这是必要的吗?感谢

好的,我能够根据ryanmarc回答解决问题,我最终做的是在initialize方法中明确设置骨干集合的模型,而不是

    Holidays:  Backbone.Collection.extend({  
    model: YM.Holidays.Holiday
    }),

我正在做这个

     Holidays: Backbone.Collection.extend({  

     inititlaize: function () 
     { 
        this.model = YM.Holidays.Holiday;
      }
   }),

另一个奇怪的事情是使用相同的代码和库,如果我切换html,以便我在一个普通div中呈现列表而不是JQM页面它也不会抛出该错误(它将列表呈现两次出于某种原因,但由于我并不是真的想要这样做,所以我没有考虑过为什么)。 例如,如果不是以下标记

<div data-role="page" id="Holidays">
  <div data-role="header">
  <h1>Holidays</h1>
  </div>
  <div data-role="content">
          <ul data-role="listview" data-inset="true" id="ulHolidays">
        </ul>
  </div>
  <div data-role="footer">
        <h3>Footer</h3>
  </div>
  </div> 

我用这个标记

  <div>
   <ul data-role="listview" data-inset="true" id="ulHolidays"></ul>
  </div>

我没有得到错误(虽然它渲染了两次,但这可能没有关系)。任何人对这里发生的事情都有任何想法或见解?

1 个答案:

答案 0 :(得分:4)

通过这个小改动它可以正常工作:http://jsfiddle.net/hnGAA/1/