Backbone.js toJSON() без атрибутов

Я действительно не могу уложить это в голове. По какой-то причине (и я подозреваю, что это имеет какое-то отношение к асинхронным запросам) атрибут моей модели не преобразуется должным образом с помощью функции toJSON(). FWIW, я пытаюсь выполнить ленивую загрузку с помощью django-relational fetchRelated().

Здесь я сделал запрос fetchRelated() и создал новое представление.

$.when(usermodel.fetchRelated("movies")).then(function(){
        var newview = new UserMovieList({model: usermodel});
        newview.render(); 
    });

И это вызывает следующую функцию рендеринга:

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

        var usermodel = this.model; 

        var wrapper = $(".movies");
            var recipes = usermodel.get("movies");
            movies.each(function(movie){
                var movie_item = new UserMovieListItem({
                    model:movie
                });
                movie_item.render(); 
                wrapper.append(movie_item.el);
            });
        return this; 

Который затем вызывает функцию рендеринга UserMovieListItem:

render: function(){
        console.log("movies to JSONify", this.model.attributes);
console.log("movies JSONified", this.model.toJSON());
        $(this.el).html(this.template(this.model.toJSON()));
        return this; 

Вот кикер. Первый console.log (this.model.attributes) отображает все атрибуты в том виде, в каком они должны быть. Кажется, это прекрасно. Но (this.model.toJSON()) возвращает только атрибуты URI и id, которые были предоставлены до fetchRelated(). Что, черт возьми, здесь происходит? Если я свяжу this.model в UserMovieListItem с 'change' для рендеринга, то он будет рендериться, но через полсекунды или около того... },

Моя модель пользователя определяется как таковая:

window.User = Backbone.RelationalModel.extend({
    urlRoot: '/movie/api/v1/users/',
    relations: [{
        type: Backbone.HasMany,
        key: 'movies',
        relatedModel: 'Movie',
        collectionType: 'UserMovieCollection',
        reverseRelation: {
            key: 'user',
            includeInJSON: 'id'
        }
    }],
    select: function(){
        var model = this; 
        model.set({selected: true});
    }
});

person bento    schedule 25.05.2012    source источник
comment
Не могли бы вы добавить определение для usermodel и ответ JSON для usermodel.fetchRelated("recipes"), кстати, проверьте, устанавливает ли $.when(usermodel.fetchRelated("recipes")) атрибуты модели   -  person Deeptechtons    schedule 25.05.2012
comment
Я только что понял, что у меня опечатка, хотя это не влияет на код. Я тоже обновлю свой вопрос.   -  person bento    schedule 25.05.2012
comment
И если я сделаю console.log пользовательской модели в .then(function(){}); это показывает, что атрибуты были применены и обновлены для соответствующих моделей фильмов.   -  person bento    schedule 25.05.2012


Ответы (1)


fetchRelated возвращает массив из jqXHR объектов, и вам нужно использовать его с $.when следующим образом:

$.when.apply(null, usermodel.fetchRelated("movies")).then(function(){
    var newview = new UserMovieList({model: usermodel});
    newview.render(); 
});
person rinat.io    schedule 25.05.2012