我有一个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,我仍然得到错误。我没有看到下划线的更改日志中有任何重大变化,但也许我错过了一些东西。
以下是我在backbone.js中获取的javascript错误的详细信息,错误消息是“this.model不是构造函数”在firebug中或“未捕获TypeError:undefined不是函数”在chrome中。在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;
},
我真的没有太多可以发布的自己的代码,因为我只是在集合上调用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/ -underscore 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>
我没有得到错误(虽然它渲染了两次,但这可能没有关系)。任何人对这里发生的事情都有任何想法或见解?