我有一個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>
我沒有得到錯誤(儘管它呈現兩次,但是這可能不相關)。任何人對這裏發生的事情有任何想法或見解?
我不認爲這是在下劃線或主幹的最新版本中的錯誤 - 我使用他們,也沒有任何問題。你可以發佈你使用這些庫的代碼嗎?我很確定這個錯誤在那裏。 – acme 2012-03-15 15:55:56
說實話,我不知道在哪裏看我的代碼。導致錯誤的行只是一個獲取調用'YM.holidays.fetch'(或者我替代它的集合)。我會嘗試創建一個新項目來重現錯誤並縮小可能導致錯誤的原因。 – Jack 2012-03-15 16:06:30
您是否檢查過該集合的模型('model = new this.model(...)''中的'this.model')是模型「class」? – 2012-03-15 17:09:40