2012-03-15 62 views
0

我有一個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,我仍然得到錯誤。我沒有在下劃線的更改日誌中看到任何重大更改,但也許我錯過了某些內容。升級underscore.js中斷backbone.js

以下是我在backbone.js中獲得的javascript錯誤的詳細信息,錯誤消息是「this.model不是構造函數」,或者是「未定義的類型錯誤:undefined不是函數」 。錯誤被拋出在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; 
}, 

我真的沒有太多的我自己的代碼,我可以發佈,因爲我打電話獲取對集合的代碼。

感謝

編輯

下面是一些代碼,再現我談論這個問題。如果我使用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(); 
}); 

EDIT 2

它變得有點陌生,這似乎是問題某種程度上與jQuery Mobile的,我打算找成多一點。同時,這裏有兩個jsfiddles,它們之間的唯一區別是它們使用哪個下劃線版本。

http://jsfiddle.net/KDMcd/ - 強調1.2.2工程 http://jsfiddle.net/hnGAA/ -underscore 1.3.1不起作用

編輯3

謝謝,在我的測試示例工作和我要去嘗試在我的實際項目中。你有什麼想法爲什麼有必要在以後明確設置模型?因爲我這樣做的方式似乎是它應該根據文檔完成的方式。還有什麼想法改變了下劃線,現在這是必要的?由於

OK,我是能夠基於ryanmarc回答,我最後做的是明確設置骨幹的集合的模型初始化方法,以便代替

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> 

我沒有得到錯誤(儘管它呈現兩次,但是這可能不相關)。任何人對這裏發生的事情有任何想法或見解?

+0

我不認爲這是在下劃線或主幹的最新版本中的錯誤 - 我使用他們,也沒有任何問題。你可以發佈你使用這些庫的代碼嗎?我很確定這個錯誤在那裏。 – acme 2012-03-15 15:55:56

+0

說實話,我不知道在哪裏看我的代碼。導致錯誤的行只是一個獲取調用'YM.holidays.fetch'(或者我替代它的集合)。我會嘗試創建一個新項目來重現錯誤並縮小可能導致錯誤的原因。 – Jack 2012-03-15 16:06:30

+0

您是否檢查過該集合的模型('model = new this.model(...)''中的'this.model')是模型「class」? – 2012-03-15 17:09:40

回答

4

它正常工作與這個小變化:http://jsfiddle.net/hnGAA/1/

+1

謝謝,這在我的測試示例中有效,我將在我的實際項目中嘗試。你有什麼想法爲什麼有必要在以後明確設置模型?因爲我這樣做的方式似乎是它應該根據文檔完成的方式。還有什麼想法改變了下劃線,現在這是必要的?謝謝 – Jack 2012-03-16 14:03:41

+0

我能夠根據你的回答得到我的代碼,我將問題留出一段時間,看看是否有人對你正在發生的事情有一些瞭解(我在此期間投了票)。 – Jack 2012-03-16 14:33:53

+0

我不是100%確定,但我仍在調查這個問題。我最近在一個我正在開發的項目中遇到了同樣的問題。如果我知道導致問題的原因,我會更新它。在集合定義中將模型設置爲'Backbone.Model'可以工作,但不能在將其設置爲擴展模型時使用。這讓我覺得它是在某個地方。在使用擴展模型後檢查集合顯示集合模型未定義。 – ryanmarc 2012-03-16 15:43:52

相關問題