簡體   English   中英

升級underscore.js會破壞ribs.js

[英]Upgrading underscore.js breaks backbone.js

我有一個Web應用程序,當前正在使用帶有主干本地存儲適配器1,underscore.js 1.2.2和jquery mobile 1.0.1的bone.js 0.5.3。 我想升級我的骨干和下划線版本,但是,當我將我的下划線版本(從1.2.2升級到1.3.1)時,在ribs.js中出現錯誤(我將在下面詳細說明錯誤)。 我嘗試僅升級下划線並同時升級下划線和ebrace.js,但仍然收到錯誤。 在下划線的變更日志中,我看不到任何重大更改,但也許我遺漏了一些東西。

這是我在ribs.js中遇到的javascript錯誤的詳細信息,錯誤消息是firebug中的“ this.model不是構造函數”或chrome中的“ Uncaught TypeError:未定義不是函數”。 該錯誤引發在ribs.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/-下划線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>

我沒有得到錯誤(盡管它渲染兩次,但這可能無關)。 有人對這里發生的事情有任何想法或見解嗎?

進行以下微小更改即可正常工作: http : //jsfiddle.net/hnGAA/1/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM