Javascript 主干模型.toJSON()不';t将所有属性呈现给JSON

Javascript 主干模型.toJSON()不';t将所有属性呈现给JSON,javascript,backbone.js,Javascript,Backbone.js,我需要将模型的属性呈现为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)后的属性输出: 下面是执行

我需要将模型的属性呈现为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)后的属性输出:

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

发生了什么事

编辑: 以下是实例:

  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应该复制属性,为什么它不复制正确的名称,或者为什么不复制创建的、更新的字段

编辑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的成功回调来呈现使用模型的视图:

  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, 
    },
  });
获取({成功:函数(模型){ var goalFullView=新的goalFullView({ 模式:目标, }); }});

方法只返回模型的
属性的浅克隆

从:

在没有看到更多代码的情况下,看起来您直接在模型对象上设置了属性,而不是使用
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());
  }
});

您能同时显示模型及其实例化吗?您的代码中还有其他一些东西使toJSON()的其他属性不可见,也许可以查看您的模型或粘贴,以及如何初始化它。。。请看,我用Model类编辑了原始帖子。我似乎无法理解toJSON为什么不起作用。尽管如此,this.model.attributes打印出正确的属性列表,但当我尝试执行此.model.get(“id”)或任何其他属性时,它们显示为空。显然,当我调用模型实例上的属性时,它就出现了。主干文档还包括state>attributes属性是包含模型状态的内部散列。请使用set更新属性,而不是直接修改属性。如果您想检索并复制模型属性的副本,请改用toJSON。可选集合语法:
model.set({name:“item”})
-此表单还允许您同时设置多个属性。
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());
  }
});