Магистраль не может прочитать свойство "свойство" неопределенной ошибки в представлении магистрали
Я только что решил изучить позвоночник. Я следую видео-учебнику. Там все работает нормально, но в конце я получаю эту ошибку "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.