Магистраль не может прочитать свойство "свойство" неопределенной ошибки в представлении магистрали


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

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.