Вопрос

По сути, я пытаюсь отправить запрос GET на мой сервер узлов, чтобы я мог вернуть сообщения в блоге для создания ссылок. Я делаю collection.fetch, который успешно завершает запрос GET (журналы сервера узлов, которые отправляет правильные объекты). Модель успешно анализирует правильные данные, но когда я пытаюсь использовать коллекцию, она говорит, что она пуста. Вот код:

var mdm = mdm || {};

// MODEL
mdm.Post = Backbone.Model.extend({
        parse: function( response ) {
        response.id = response._id;
        console.log(response); // logs the two documents
        return response;
    }
});

// COLLECTION
mdm.Posts = Backbone.Collection.extend({
    model: mdm.Post,
    url: '/api/posts'
});

// MODEL VIEW
mdm.LinkView = Backbone.View.extend({
    template: _.template( $('#link_template').html() ),

    render: function() {
        this.$el.html( this.template( this.model.toJSON() ));
        return this;
    }
});

// COLLECTION VIEW
mdm.LinksView = Backbone.View.extend({
    el: '#link_list',

    initialize: function() {
        this.collection = new mdm.Posts();
        this.collection.fetch({reset: true});
                // makes the request properly, but collection is empty
        this.render();
                // never gets called because the collection is empty
        console.log(this.collection.length); 
                // logs a length of 0
    },

    render: function() {
        // renders collection
    }
});

$(function() {
    new mdm.LinksView();
});

Данные отправляются и анализируются в моделях, поэтому я не уверен, что коллекция в конечном итоге пустая. Любая помощь будет очень оценена.

Это было полезно?

Решение

Наиболее вероятная причина, по которой вы не видите модели, по вашему мнению, заключается в том, что рендерин происходит до асинхронного fetch завершено.

Что -то вроде ниже сработает лучше:

mdm.LinksView = Backbone.View.extend({
    el: '#link_list',

initialize: function() {
    this.collection = new mdm.Posts();
    this.listenTo(this.collection, 'reset', this.render);
    this.collection.fetch({reset: true});
}

Приведенный выше код устанавливает слушателя для reset событие на collection и выполняет render функционируйте, когда это произойдет.

Кроме того, вы могли бы пройти в success а также error обработчики в fetch и назовите функцию рендеринга вручную.

this.collection.fetch({
    success: _.bind(function() { 
        this.render(); }, this)
});

Надеюсь это поможет!

Другие советы

За комментарий @fbynite, проблема была связана с fetch быть асинхронным. Я сделал следующие изменения в представлении коллекции, и это помогло:

initialize: function() {
    var self = this;
    this.collection = new mdm.Posts();
    this.collection.fetch({reset: true,
        success: function() {
            self.render();
            console.log(self.collection.length);
        }
    });
},

Код является модификацией из учебного пособия по основу, поэтому другие пользователи могут столкнуться с аналогичной проблемой. http://addyosmani.github.io/backbone-fundamentals/#exercise-2-book-library-your-first-restful-backbone.js-app

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top