2012-04-21 3 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 

Что случилось?

Edit: Вот конкретизации:

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?

Edit 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, 
    }, 
    }); 

Edit 3: Я понял, что мне нужно использовать обратный вызов из выборки, чтобы сделать вид, который использует модель:

goal.fetch ({успех: функция (модель) { var goalFullView = новый GoalFullView ({ модель: цель, }); }});

+0

вы можете показать модель и ее экземпляра, а? – mindandmedia

+0

У вас есть что-то еще в вашем коде, что делает другие атрибуты невидимыми для jSON(), возможно, посмотрите на вашу модель или вставить, как вы ее инициализируете ... см. [Jsfiddle] (http://jsfiddle.net/drinchev/ JLfJB/1 /) – drinchev

+0

Я отредактировал исходное сообщение с помощью класса модели. Я не могу понять, почему theJSON не работает. Несмотря на то, что this.model.attributes выводит правильный список атрибутов, когда я пытаюсь выполнить this.model.get («id») или любой другой атрибут, они выглядят пустыми. Очевидно, что он присутствует, когда я вызываю атрибуты экземпляра модели. – egidra

ответ

27

Метод toJSON() только возвращает мелкий клон модели attributes.

От annotated Backbone.js source:

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

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

I.e. не делать этого:

model.name = "item"; 

сделать это:

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

EDIT:

Для вашего конкретного вопроса, то возможно, что вы назвали 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

В базовых документах также указано состояние> Свойство атрибутов - это внутренний хеш, содержащий состояние модели. Пожалуйста, используйте set, чтобы обновлять атрибуты, а не изменять их напрямую. Если вы хотите получить и отобразить копию атрибутов модели, вместо этого используйте toJSON. – Trevor

+3

Синтаксис альтернативного набора: 'model.set ({name:" item "})' - эта форма позволяет одновременно установить множество свойств. – stusmith

Смежные вопросы