Обновление underscore.js ломает backbone.js - PullRequest
0 голосов
/ 15 марта 2012

У меня есть веб-приложение, которое в настоящее время использует 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>

Я не получаю ошибку (хотя она отображается дважды, но, вероятно, это не связано). У кого-нибудь есть идеи или идеи относительно того, что здесь происходит?

1 Ответ

4 голосов
/ 16 марта 2012

отлично работает с этим небольшим изменением: http://jsfiddle.net/hnGAA/1/

...