Магистральная модель .toJSON() не отображает все атрибуты JSON

Мне нужно отобразить атрибуты модели 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/"

Вот пример модели 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: Я понял, что мне нужно использовать обратный вызов успеха из fetch, чтобы отобразить представление, которое использует модель:

target.fetch({success: function (model) {   var goalFullView = новый GoalFullView ({     модель: цель,   }); }});

Ответ 1

Метод toJSON() просто возвращает неглубокий клон свойства модели attributes.

Из аннотированного источника Backbone.js:

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

Не видя больше своего кода, похоже, что вы напрямую задаете свойства объекта модели, вместо использования функции set для установки атрибутов модели.

т.е. не делайте этого:

model.name = "item";

сделайте следующее:

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

EDIT:

Для вашей конкретной проблемы возможно, что вы позвонили в JSON до того, как модель закончила загрузку с сервера.

например. Это не всегда будет работать так, как ожидалось:

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