Javascript 升级下划线.js会中断主干.js
我有一个web应用程序,目前正在使用backbone.js 0.5.3和backbone local storage adapter 1、underline.js 1.2.2和jquery mobile 1.0.1。 我想升级我的主干和下划线版本,但是当我升级我的下划线版本(1.2.2到1.3.1)时,我在backbone.js中遇到了一个错误(我将在下面详细说明错误)。我尝试升级下划线并升级下划线和backbone.js,但仍然出现错误。我在更改日志中没有看到下划线的任何破坏性更改,但可能我遗漏了什么 下面是我在backbone.js中得到的javascript错误的详细信息,错误消息是firebug中的“this.model不是构造函数”或“uncaughttypeerror:undefined不是函数”在chrome中,错误出现在backbone.collection的_prepareModel方法中,该方法由add方法调用,add方法根据我代码中的fetch调用触发(从本地存储而不是服务器提取)。我看到的是“model”未定义(我认为它应该是一个函数)在方法中,这就是它抛出错误的原因,我只是不太确定该怎么办 下面是_prepareModel方法的代码Javascript 升级下划线.js会中断主干.js,javascript,jquery-mobile,backbone.js,underscore.js,Javascript,Jquery Mobile,Backbone.js,Underscore.js,我有一个web应用程序,目前正在使用backbone.js 0.5.3和backbone local storage adapter 1、underline.js 1.2.2和jquery mobile 1.0.1。 我想升级我的主干和下划线版本,但是当我升级我的下划线版本(1.2.2到1.3.1)时,我在backbone.js中遇到了一个错误(我将在下面详细说明错误)。我尝试升级下划线并升级下划线和backbone.js,但仍然出现错误。我在更改日志中没有看到下划线的任何破坏性更改,但可能我遗
_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
谢谢
编辑
下面的一些代码再现了我所说的问题。如果我使用Underline.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有关,我打算进一步研究一下。同时,这里有两个JSFIDDLE,它们之间的唯一区别是使用哪一个版本的下划线
-下划线1.2.2工程
-下划线1.3.1不起作用
编辑3
谢谢,这在我的测试示例中起作用,我将在我的实际项目中尝试。你知道为什么以后有必要显式设置模型吗?因为我这样做的方式似乎是基于文档应该这样做的方式。还有,在下划线中改变了什么,这现在是必要的吗ks 好的,我根据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>
我没有得到错误(虽然它渲染了两次,但这可能没有关系)。有人对这里发生的事情有什么想法或见解吗?这个小改动很好:这个小改动很好:我认为最新版本的下划线或主干中没有错误-我也在使用它们,没有任何问题。你能发布使用这些库的代码吗?我是p请确保错误在那里。老实说,我不知道在我的代码中到底要查找到哪里。导致错误的行只是一个fetch调用
YM.holidays.fetch
(或我用它代替的任何集合)。我将尝试创建一个新项目以复制错误,并缩小可能导致错误的范围。您是否已检查集合的模型(this.model
中的model=new this.model(…)
)是否为模型“类”?我不确定我是否遵循,你的意思是我是否指定了集合的模型?如果是,那么我是。无论如何,我已经能够在一个小得多的项目中重现问题,因此我将相应地更新我的问题。我不认为下划线或主干的最新版本中存在错误-我也在使用它们,没有任何问题。可以吗请发布使用这些库的代码?我很确定错误就在那里。老实说,我不知道在我的代码中到底要查找到哪里。导致错误的行只是一个fetch调用YM.holidays.fetch
(或我用它替代的任何集合)。我将尝试创建一个新项目以复制错误,并缩小可能导致错误的范围。您是否已检查集合的模型(this.model
中的model=new this.model(…)
)是否为模型“类”?我不确定我是否遵循,你的意思是我是否指定了集合的模型?如果是,那么我是。无论如何,我能够在一个小得多的项目中重现问题,所以我将相应地更新我的问题。谢谢,这在我的测试示例中起作用,我将在我的实际项目中尝试。你知道为什么有必要吗我想稍后再明确地设置模型吗?因为我当时的做法似乎是基于文档应该采取的方式。还有,你知道有什么改变强调这现在是必要的吗?谢谢,我能够根据你的回答让我的代码正常工作,我把问题留得更久一点,看看是否有人有我的想法关于发生了什么事(我同时投票支持你)。我不是100%确定,但我仍在研究这个问题。我最近在一个我正在处理的项目中遇到了相同的问题。如果我能找出问题的原因,我会更新这个。在集合定义中将模型设置为Backbone.model
,但在将其设置为