Магистраль не может прочитать свойство "свойство" неопределенной ошибки в представлении магистрали
Я только что решил изучить позвоночник. Я следую видео-учебнику. Там все работает нормально, но в конце я получаю эту ошибку "Uncaught TypeError: не могу прочитать свойство 'name' из undefined".
Вот мой код:
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 " выдает" Uncaught TypeError: не удается прочитать свойство 'name' ошибки "undefined". Конечно, если я не использую свойство 'name' в представлении, я получаю "Uncaught TypeError: Cannot read property 'category' of undefined". В клипе учебник, который я следую, все работает нормально (он использует версию 0.9.1 backbonejs). Я использую последнюю версию (1.1.0).
Кто-нибудь знает, почему я получаю эту ошибку? Там нет ничего неправильно написанного, все в правильном порядке (точно так же, как в видео-уроке, где это работает). Почему костяк бросает мне эту ошибку?
1 ответ:
Основные представления, используемые для автоматического копирования параметров конструктора в
this.options
но уже не :Журнал Изменений
1.1.0 - Октябрь. 10, 2013Представления магистрали больше не будут автоматически присоединять параметры, передаваемые конструктору как
this.options
, но вы можете сделать это сами, если хотите.Так что, если вы зависите от
this.options
, установленных в ваших представлениях, вам придется сделать это самостоятельно:var MenuItemDetails = Backbone.View.extend({ initialize: function(options) { this.options = options; }, //... });
Или лучше, распакуйте параметры, чтобы вы знали, каков интерфейс вашего представления:
Таким образом, у вас, по крайней мере, есть список того, что вы ожидаете увидеть вinitialize: function(options) { this.options = _(options).pick('name', 'category', 'imagepath'); }
options
.