2012-04-21 76 views
11

我需要将模型的属性呈现给JSON,以便我可以将它们传递到模板中。 下面是一个视图渲染()函数如下:骨干模型.toJSON()不会将所有属性呈现给JSON

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

这里是干什么的console.log(this.model)后的属性输出:

created_at: "2012-04-19" 
id: "29" 
name: "item" 
resource_uri: "/api/v1/item/29/" 
updated_at: "2012-04-21" 
user: "/api/v1/user/9/" 

这里是模型的JSON console.log(this.model.toJSON())后输出:

id: "29" 
__proto__: Object 

发生了什么事?

编辑: 下面是实例:

var goal = new Goal({id: id}); 
    goal.fetch(); 
    var goalFullView = new GoalFullView({ 
    model: goal, 
    }); 

下面是新视图的内容:

console.log(this.model.attributes); 
    console.log(this.model.toJSON()); 

这里是控制台说什么:

Object 
created_at: "2012-04-23" 
id: "32" 
name: "test" 
resource_uri: "/api/v1/goal/32/" 
updated_at: "2012-04-23" 
user: "/api/v1/user/9/" 
__proto__: Object 

Object 
id: "32" 
name: "test" 
__proto__: Object 

如果toJSON应该对这些属性进行克隆,为什么不复制正确的名称或者为什么不复制created_at,updated_at字段?

编辑2: 这里是模型:

var Goal = Backbone.Model.extend({ 

    // Default attributes for Goal 
    defaults: { 
     name: "empty goal", 
    }, 

    // Check that the user entered a goal 
    validate: function(attrs) { 
     if (!attrs.name) { 
     return "name is blank"; 
     } 
    }, 

    // Do HTTP requests on this endpoint 
    url: function() { 
     if (this.isNew()) { 
     return API_URL + "goal/" + this.get("id") + FORMAT_JSON; 
     } 
     return API_URL + "goal/" + FORMAT_JSON; 
     //API_URL + "goal" + FORMAT_JSON, 
    }, 
    }); 

编辑3: 我想通了,我需要使用成功回调从取来呈现使用模型视图:

goal.fetch({success:function(model){goal_ullview = new GoalFullView({ model:goal, }); }});

+0

可以告诉你的模型及其实例呢? – mindandmedia 2012-04-21 20:13:04

+0

您的代码中还有其他属性可以让其他属性对于jSON()不可见,也许您可​​以查看模型或粘贴,以及如何初始化它...请参阅[jsfiddle](http://jsfiddle.net/drinchev/ JLfJB/1 /) – drinchev 2012-04-23 08:26:08

+0

我使用Model类编辑原始帖子。我似乎无法弄清楚为什么toJSON不起作用。尽管,当我尝试执行this.model.get(“id”)或任何其他属性时,this.model.attributes会打印出正确的属性列表,但它们会显示为空。显然,当我在模型实例上调用属性时,它就存在了。 – egidra 2012-04-24 02:47:03

回答

27

toJSON()方法只是返回模型的attributes属性的浅表副本。

annotated Backbone.js source

toJSON: function(options) { 
    return _.clone(this.attributes); 
} 

没有看到您的更多的代码,它看起来像你直接设置属性的模型对象上,而不是使用set函数来设置模型属性。

I.e.不这样做:

model.name = "item"; 

做到这一点:

model.set("name", "item"); 

编辑:

为了您的具体问题,它可能是你叫的toJSON模型已经从服务器完成加载之前。

E.g.这不会总是按预期:

var model = new Goal({id: 123}); 
model.fetch(); 
console.log(model.toJSON()); 

但是,这将:

var model = new Goal({id: 123}); 
model.fetch({ 
    success: function() { 
    console.log(model.toJSON()); 
    } 
}); 
+1

Backbone docs也state>属性属性是包含模型状态的内部哈希。请使用set来更新属性,而不是直接修改它们。如果您想检索并挖掘模型属性的副本,请改为使用toJSON。 – Trevor 2012-04-22 13:13:48

+3

另一种设置语法:'model.set({name:“item”})' - 这个表单可以让你一次设置很多属性。 – stusmith 2012-04-25 14:27:51