2016-04-30 3 views
2

При выполнении операции выборки на модели я вижу API, возвращающий нужные данные в формате JSON. При регистрации в консоли модели отображаются новые данные в «измененном» объекте.Массивная модель выборки, а затем визуализировать вид

До и после извлечения:

Object { 
    cid: "c1", 
    attributes: Object, 
    _changing: false, 
    _previousAttributes: Object, 
    changed: Object, 
    id: undefined, 
    _pending: false 
} 

Object { 
    cid: "c1", 
    attributes: Object, 
    _changing: false, 
    _previousAttributes: Object, 
    changed: Object[1], 
    id: undefined, 
    _pending: false 
} 

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

App.Models.Document = Backbone.Model.extend({ 

    defaults: { 
    id: '', 
    owner: 0, 
    created: '', 
    lastupdate: '', 
    content: 'Default document content' 
    }, 

    url: '/api/' 

}); 


App.Views.DocumentView = Backbone.View.extend({ 

    tagName: 'textarea', 
    className: 'editor', 

    template: App.Template('editortemplate'), 

    initialize: function() { 

    // As proposed in so many similar questions 
    this.listenTo(this.model, "change", this.render); 

    }, 
    render: function() { 

    this.$el.html(this.template(this.model.toJSON())); 

    $(".app-content").html(this.$el); 

    return this; 

    } 
}); 


a = new App.Models.Document(); 
a.fetch(); 
b = new App.Views.DocumentView({ model: a }); 
b.render(); 

Как обновить представление должным образом новыми данными?

Если я удаляю значения по умолчанию из модели, «контент» не определен.

+0

Это странно, что 'изменилось: Object' изменения в' изменен: Object [1], '. Какова структура данных, возвращаемых API? Идентификатор BTW является специальным атрибутом, используемым магистральной сетью. –

+0

Возвращаемые данные объекта JSON [{ "идентификатор": "1", "владелец": "1", "создано": "2016-04-30 21:57:23", " lastupdate ": null, " content ":" Successful API fetch " }] – hesonline

+2

Это означает, что вам нужно реализовать либо' parse() 'для обработки ответа до того, как Backbone задает его атрибутам модели, либо вам нужно извлечь из этот ресурс REST из ['Collection'] (http://backbonejs.org/#Collection). –

ответ

1

Backbone.Model ожидает объект должен быть возвращен с сервера, а не массив. Массив должен быть возвращен в случае коллекции.

Так что в вашем случае вам нужно определить метод parse возвращать объект, содержащий данные:

App.Models.Document = Backbone.Model.extend({ 
    defaults: { 
    owner: 0, 
    created: '', 
    lastupdate: '', 
    content: 'Default document content' 
    }, 
    url: '/api/', 
    parse: function(response) { 
    return response[0]; 
    } 

}); 
+0

Проанализируйте вместе с listenTo трюк. – hesonline

1

Вы можете слушать оконечное устройство sync на этой модели. sync пожаров после успешного вызова на сервер

this.listenTo(this.model, 'sync', this.render); 

Также вы можете переместить вашу модель принести в App.Views.DocumentView, в методе инициализации. Чем, в случае успеха вы оказываете мнение:

App.Models.Document = Backbone.Model.extend({ 
    defaults: { 
    id: '', 
    owner: 0, 
    created: '', 
    lastupdate: '', 
    content: 'Default document content' 
    }, 

    url: '/api/' 
}); 


App.Views.DocumentView = Backbone.View.extend({ 
    tagName: 'textarea', 
    className: 'editor', 
    template: App.Template('editortemplate'), 
    initialize: function() { 
    var self = this; 

    // model fetch 
    this.model.fetch({ 
     success: function() { 
     // call render 
     self.render(); 
     }, 
     error: function() { 
     // handle error 
     } 
    }); 

    // As proposed in so many similar questions 
    this.listenTo(this.model, "change", this.render); 
    }, 
    render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
    $(".app-content").html(this.$el); 
    return this; 
    } 
}); 


var myModel = new App.Models.Document(); 
var myView = new App.Views.DocumentView({ 
    model: myModel 
}); 
myView.render(); 
+0

Спасибо Yosvel. К сожалению, ничего не изменилось. Отображается значение по умолчанию. Выполняется выборка, и объект модели имеет «измененное» значение, которое я до сих пор не могу получить. – hesonline

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