【问题标题】:Backbone model .toJSON() doesn't render all attributes to JSON骨干模型 .toJSON() 不会将所有属性呈现为 JSON
【发布时间】:2012-05-02 23:59:08
【问题描述】:

我需要将模型的属性呈现为 JSON,以便将它们传递到模板中。 下面是视图的 render() 函数的样子:

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/"

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

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: 我发现我需要使用 fetch 中的成功回调来渲染使用模型的视图:

goal.fetch({成功:函数(模型){ var 目标全视图 = 新目标全视图({ 模型:目标, }); }});

【问题讨论】:

  • 你能展示模型及其实例吗?
  • 您的代码中有其他内容使 toJSON() 的其他属性不可见,也许查看您的模型或粘贴,您是如何初始化它的...请参阅jsfiddle
  • 我使用 Model 类编辑了原始帖子。我似乎无法弄清楚为什么 toJSON 不起作用。即使 this.model.attributes 打印出正确的属性列表,当我尝试执行 this.model.get("id") 或任何其他属性时,它们仍显示为空。显然,当我在模型实例上调用属性时,它就会出现。

标签: javascript backbone.js


【解决方案1】:

toJSON() 方法只返回模型的 attributes 属性的浅层克隆。

来自annotated Backbone.js source:

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

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

即不要这样做:

model.name = "item";

这样做:

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

编辑:

对于您的具体问题,您可能在模型完成从服务器加载之前调用了 toJSON。

例如这并不总是按预期工作:

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

【讨论】:

  • Backbone docs also state > attributes 属性是包含模型状态的内部散列。请使用 set 来更新属性,而不是直接修改它们。如果您想检索和修改模型属性的副本,请改用 toJSON。
  • 另一种设置语法:model.set({name: "item"}) - 此表单也可以让您同时设置多个属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多