Магистральная модель .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());
}
});