2013-12-16 5 views
2

Я только что решил научиться магистрали. Я следую видеоуроку. Там все отлично работает, но в конце я получаю эту ошибку «Uncaught TypeError: невозможно прочитать свойство« имя неопределенного ».Backbone Невозможно прочитать свойство «свойства» неопределенной ошибки в базовом виде

Вот мой код:

 

    var MenuItemDetails = Backbone.View.extend({ 
     render: function() { 
      var markup = this.options.name + this.options.category + this.options.imagepath; 
      // I also had some html markup in the string above, of course, but I've striped it because stackoverflow didn't show it in the preview of my post. 
      this.$el.html(markup); 
      return this; 
     } 
    }); 

    var AppRouter = Backbone.Router.extend({ 
     routes: { 
      "" : "list", 
      "menu-items/new" : "itemForm", 
      "menu-items/:item" : "itemDetails" 
     }, 

     list: function() { 
      $('#app').html('List screen'); 
     }, 

     itemDetails: function(item) { 
      var view = new MenuItemDetails({ name: item, category: 'Some category', imagepath: 'no-image.jpg' }); 
      $('#app').html(view.render().el); 
     }, 

     itemForm: function() { 
      $('#app').html('New item form'); 
     } 
    }); 

    var app = new AppRouter(); 

    $(function() { 
     Backbone.history.start(); 
    }); 

Функция «itemDetails» дает «неперехваченным TypeError: Не удается прочитать„имя“свойства неопределенной» ошибки. Конечно, если я не использую свойство «name» в представлении, я получаю «Uncaught TypeError: Can not read property» category «undefined». В видеоуроке, за которым я следую, все работает нормально (используется версия 0.9.1 backbonejs). Я использую последние (1.1.0).

Кто-нибудь знает, почему я получаю эту ошибку? Нет ничего орфографического, все в правильном порядке (точно так же, как в видеоуроке, где оно работает). Почему позвоночник выбрасывает мне эту ошибку?

ответ

7

просмотров Магистральных используются для автоматического копирования параметров конструктора this.optionsbut no longer:

Change Log
1.1.0 — Oct. 10, 2013

  • Backbone Views no longer automatically attach options passed to the constructor as this.options , but you can do it yourself if you prefer.

Так что, если вы в зависимости от this.options быть установлены в ваших взглядах, то вы должны будете сделать это самостоятельно:

var MenuItemDetails = Backbone.View.extend({ 
    initialize: function(options) { 
     this.options = options; 
    }, 
    //... 
}); 

Или лучше, распаковать параметры так, что вы знаете, что интерфейс вашей точки зрения заключается в следующем:

initialize: function(options) { 
    this.options = _(options).pick('name', 'category', 'imagepath'); 
} 

Таким образом, у вас есть хотя бы список того, что вы ожидаете увидеть в options.

+1

Мне нравится белый список вариантов. Еще один ответ стоит прочитать :) – nikoshr

+0

@nikoshr: Да, мне никогда не нравятся автоматические вещи 'this.options', слишком много которых невозможно отслеживать,« как я должен отлаживать этот материал на расстоянии до шести месяцев? » магия для моих вкусов. –

Смежные вопросы