[英]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.