У меня есть веб-приложение, которое в настоящее время использует backbone.js 0.5.3 с адаптером локального хранилища магистрали 1, underscore.js 1.2.2 и jquery mobile 1.0.1.
Я хотел обновить свою версию магистрали и подчеркивания, однако, когда я обновляю свою версию подчеркивания (1.2.2 до 1.3.1), я получаю ошибку в backbone.js (я подробно опишу ошибку ниже). Я попытался просто обновить подчеркивание и обновить underscore и backbone.js, и все равно получаю ошибку. Я не вижу каких-либо серьезных изменений в журнале изменений для подчеркивания, но, возможно, я что-то упустил.
Вот подробности ошибки javascript, которую я получаю в backbone.js, сообщение об ошибке «this.model не является конструктором» в firebug или «Uncaught TypeError: undefined не является функцией» в chrome. Ошибка генерируется в методе _prepareModel коллекции backbone.collection, которая вызывается его методом 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 для коллекции.
Спасибо
EDIT
Вот код, который воспроизводит проблему, о которой я говорю. Если я использую 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>
Я не получаю ошибку (хотя она отображается дважды, но, вероятно, это не связано). У кого-нибудь есть идеи или идеи относительно того, что здесь происходит?