【发布时间】:2012-04-01 04:14:26
【问题描述】:
我有一个 Web 应用程序,目前正在使用带有骨干本地存储适配器 1、underscore.js 1.2.2 和 jquery mobile 1.0.1 的主干.js 0.5.3。 我想升级我的主干和下划线版本,但是当我升级我的下划线版本(1.2.2 到 1.3.1)时,我在主干.js 中遇到错误(我将在下面详细说明错误)。我尝试只升级下划线并同时升级下划线和主干.js,但我仍然得到错误。我在下划线的更新日志中没有看到任何重大更改,但也许我遗漏了一些东西。
这是我在backbone.js中遇到的javascript错误的详细信息,错误消息是firebug中的“this.model is not a constructor”或chrome中的“Uncaught TypeError: undefined is not a function”。错误是在主干.collection 的 _prepareModel 方法中引发的,该方法由其 add 方法调用,该方法基于我的代码中的 fetch 调用(从本地存储而不是服务器中提取)触发。我可以看到,“模型”在方法中是未定义的(我认为它应该是一个函数),这就是它抛出错误的原因,我只是不太确定该怎么做。
这是 _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 的回答解决这个问题,我最终做的是在初始化方法中明确设置主干的集合模型,而不是
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>
我没有收到错误(虽然它渲染了两次,但这可能不相关)。有人对这里发生的事情有任何想法或见解吗?
【问题讨论】:
-
我认为最新版本的下划线或主干没有错误 - 我也在使用它们,没有任何问题。您能否发布使用这些库的代码?我很确定错误就在那里。
-
老实说,我不知道在我的代码中的确切位置。导致错误的行只是一个获取调用
YM.holidays.fetch(或我替换它的任何集合)。我将尝试创建一个新项目来重现该错误并缩小可能导致该错误的原因。 -
您是否检查过该集合的模型(
this.modelinmodel = new this.model(...))是模型“类”? -
我不确定我是否遵循,您的意思是我是否指定了该系列的型号?如果是,那么我就是。无论如何,我已经能够在一个小得多的项目中重现该问题,因此我将相应地更新我的问题。
标签: javascript jquery-mobile backbone.js underscore.js