Javascript 升级下划线.js会中断主干.js

Javascript 升级下划线.js会中断主干.js,javascript,jquery-mobile,backbone.js,underscore.js,Javascript,Jquery Mobile,Backbone.js,Underscore.js,我有一个web应用程序,目前正在使用backbone.js 0.5.3和backbone local storage adapter 1、underline.js 1.2.2和jquery mobile 1.0.1。 我想升级我的主干和下划线版本,但是当我升级我的下划线版本(1.2.2到1.3.1)时,我在backbone.js中遇到了一个错误(我将在下面详细说明错误)。我尝试升级下划线并升级下划线和backbone.js,但仍然出现错误。我在更改日志中没有看到下划线的任何破坏性更改,但可能我遗

我有一个web应用程序,目前正在使用backbone.js 0.5.3和backbone local storage adapter 1、underline.js 1.2.2和jquery mobile 1.0.1。 我想升级我的主干和下划线版本,但是当我升级我的下划线版本(1.2.2到1.3.1)时,我在backbone.js中遇到了一个错误(我将在下面详细说明错误)。我尝试升级下划线并升级下划线和backbone.js,但仍然出现错误。我在更改日志中没有看到下划线的任何破坏性更改,但可能我遗漏了什么

下面是我在backbone.js中得到的javascript错误的详细信息,错误消息是firebug中的“this.model不是构造函数”或“uncaughttypeerror:undefined不是函数”在chrome中,错误出现在backbone.collection的_prepareModel方法中,该方法由add方法调用,add方法根据我代码中的fetch调用触发(从本地存储而不是服务器提取)。我看到的是“model”未定义(我认为它应该是一个函数)在方法中,这就是它抛出错误的原因,我只是不太确定该怎么办

下面是_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

谢谢

编辑

下面的一些代码再现了我所说的问题。如果我使用Underline.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有关,我打算进一步研究一下。同时,这里有两个JSFIDDLE,它们之间的唯一区别是使用哪一个版本的下划线

-下划线1.2.2工程 -下划线1.3.1不起作用

编辑3


谢谢,这在我的测试示例中起作用,我将在我的实际项目中尝试。你知道为什么以后有必要显式设置模型吗?因为我这样做的方式似乎是基于文档应该这样做的方式。还有,在下划线中改变了什么,这现在是必要的吗ks

好的,我根据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>


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

    这个小改动很好:

    这个小改动很好:

    我认为最新版本的下划线或主干中没有错误-我也在使用它们,没有任何问题。你能发布使用这些库的代码吗?我是p请确保错误在那里。老实说,我不知道在我的代码中到底要查找到哪里。导致错误的行只是一个fetch调用
    YM.holidays.fetch
    (或我用它代替的任何集合)。我将尝试创建一个新项目以复制错误,并缩小可能导致错误的范围。您是否已检查集合的模型(
    this.model
    中的
    model=new this.model(…)
    )是否为模型“类”?我不确定我是否遵循,你的意思是我是否指定了集合的模型?如果是,那么我是。无论如何,我已经能够在一个小得多的项目中重现问题,因此我将相应地更新我的问题。我不认为下划线或主干的最新版本中存在错误-我也在使用它们,没有任何问题。可以吗请发布使用这些库的代码?我很确定错误就在那里。老实说,我不知道在我的代码中到底要查找到哪里。导致错误的行只是一个fetch调用
    YM.holidays.fetch
    (或我用它替代的任何集合)。我将尝试创建一个新项目以复制错误,并缩小可能导致错误的范围。您是否已检查集合的模型(
    this.model
    中的
    model=new this.model(…)
    )是否为模型“类”?我不确定我是否遵循,你的意思是我是否指定了集合的模型?如果是,那么我是。无论如何,我能够在一个小得多的项目中重现问题,所以我将相应地更新我的问题。谢谢,这在我的测试示例中起作用,我将在我的实际项目中尝试。你知道为什么有必要吗我想稍后再明确地设置模型吗?因为我当时的做法似乎是基于文档应该采取的方式。还有,你知道有什么改变强调这现在是必要的吗?谢谢,我能够根据你的回答让我的代码正常工作,我把问题留得更久一点,看看是否有人有我的想法关于发生了什么事(我同时投票支持你)。我不是100%确定,但我仍在研究这个问题。我最近在一个我正在处理的项目中遇到了相同的问题。如果我能找出问题的原因,我会更新这个。在集合定义中将模型设置为
    Backbone.model
    ,但在将其设置为