Backbone.js toJSON() 不包括属性

Posted

技术标签:

【中文标题】Backbone.js toJSON() 不包括属性【英文标题】:Backbone.js toJSON() not including attributes 【发布时间】:2012-05-25 06:36:57 【问题描述】:

我真的无法理解这个。出于某种原因,(我怀疑它与异步请求有 something)我的模型属性没有使用 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()) 只返回在 fetchRelated() 之前提供的 URI 和 id 属性。这到底是怎么回事?如果我将 UserMovieListItem 中的 this.model 与“更改”绑定以进行渲染,那么它渲染,但在半秒左右之后...... ,

我的用户模型是这样定义的:

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);
    
);

【问题讨论】:

能否添加usermodel 的定义和usermodel.fetchRelated("recipes") 的JSON 响应,顺便检查$.when(usermodel.fetchRelated("recipes")) 是否正在设置模型属性 我刚刚意识到我有一个错字——尽管这不会影响代码。我也会更新我的问题。 如果我在 .then(function());它表明属性已被应用并更新到相关的电影模型。 【参考方案1】:

fetchRelated 返回jqXHR 对象的数组,您需要将它与 $.when 一起使用:

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

【讨论】:

以上是关于Backbone.js toJSON() 不包括属性的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js 将模型添加到集合问题

我对Backbone.js的一些认识

如何仅使用 Javascript 在 Backbone.js 中引导集合

Backbone.js 路由而不更改 url

View.render()中的'this'被设置为模型

Backbone.js:为 Backbone.sync 实现定义超时