Backbone.js — просмотр не перезагружается

Итак, мне удалось выяснить, как заполнить мою коллекцию из внешнего файла и отобразить представление на основе URL-адреса, но я столкнулся с проблемой. Приведенный ниже код работает по назначению, за исключением загрузки страницы, я получаю следующую ошибку:

Uncaught TypeError: Cannot call method 'get' of undefined 

Избавление от «view.render()» устраняет ошибку, но теперь приложение больше не реагирует на изменения идентификатора в URL-адресе (например, переход с #/donuts/1 на #/donuts/2 не обновляет представление)

Может ли кто-нибудь указать мне правильное направление здесь?

Код:

(function(){
var Donut = Backbone.Model.extend({
    defaults: {
        name: null,
        sprinkles: null,
        cream_filled: null
    }
});
var Donuts = Backbone.Collection.extend({
    url: 'json.json',
    model: Donut,
    initialize: function() {
        this.fetch();
    }
})

var donuts = new Donuts();

var donutView = Backbone.View.extend({
     initialize: function() {
        this.collection.bind("reset", this.render, this)
    }, 
    render: function() {
        console.log(this.collection.models[this.id].get('name'))
    }
});

var App = Backbone.Router.extend({
    routes: {
        "donut/:id" : 'donutName',
    },

    donutName: function(id) {
        var view = new donutView({
            collection: donuts,
            id: id
        });
        view.render();

    }
});

var app = new App();
Backbone.history.start();
})(jQuery);

JSON:

[
    {
        "name": "Boston Cream",
        "sprinkles" : "false",
        "cream_filled": "true"
    },
    {
        "name": "Plain",
        "sprinkles": "false",
        "cream_filled": "false"
    },
    {
        "name": "Sprinkles",
        "sprinkles": "true",
        "cream_filled": "false"
    }
]

person Brian    schedule 11.06.2012    source источник


Ответы (1)


Похоже, здесь немного проблема с потоком. У вас есть представление, прослушивающее событие "сброса" коллекции. Поэтому, когда произойдет сброс, представление будет отображаться. Это просто прекрасно. Но я считаю, что проблема в вашем роутере. При маршрутизации вы создаете новый экземпляр представления, но ничего не делаете с коллекцией, поэтому его состояние остается прежним.

Поскольку вы уже наблюдаете за коллекцией, ничего не делайте с представлением. При маршрутизации обновите URL-адрес коллекции, а затем выполните выборку. Это вызовет сброс, после чего представление должно обновиться.

person Brendan Delumpa    schedule 11.06.2012
comment
Джекпот! Это именно то, что я искал. Благодаря тонну! - person Brian; 12.06.2012
comment
Рад, что смог помочь! Одна вещь, которую вы могли бы рассмотреть, — это моделирование ваших взаимодействий до их кодирования. Я использую для этого диаграммы последовательности UML, и это благотворно сказалось на качестве моего кода, избавив меня от догадок. - person Brendan Delumpa; 12.06.2012