2016-04-30 8 views
2

Wenn ich den Abrufvorgang für ein Modell durchführe, kann ich sehen, dass die API die gewünschten Daten im JSON-Format zurückgibt. Die Konsolenprotokollierung des Modells zeigt die neuen Daten in einem "geänderten" Objekt an.Backbone-Fetch-Modell, dann Render-Ansicht

Vor und nach fetch:

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 
} 

Die Daten offensichtlich wird, abgerufen, und es ist im Modell vorhanden sind. Beim Rendern werden jedoch die Standardwerte angezeigt.

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

Wie aktualisiere ich die Ansicht ordnungsgemäß mit den neuen Daten?

Wenn ich die Standardwerte aus dem Modell entferne, ist 'Inhalt' nicht definiert.

+0

Es ist seltsam, dass 'geändert: Object' Änderungen an' geändert: Object [1], '. Wie ist die Struktur der Daten, die von der API zurückgegeben werden? BTW ID ist ein spezielles Attribut, das vom Backbone verwendet wird. –

+0

die zurückgegebenen Daten ist ein json Objekt [{ "id": "1", "Besitzer": "1", "erstellt": "2016.04.30 21.57.23" " lastupdate ": null, " content ":" Erfolgreiches API-Fetch " }] – hesonline

+2

Das bedeutet, dass Sie entweder' parse() 'implementieren müssen, um die Antwort zu verarbeiten, bevor Backbone sie auf die Modellattribute setzt oder abholen muss diese REST-Ressource aus einer ['Collection'] (http://backbonejs.org/#Collection). –

Antwort

1

Backbone.Model ein Objekt erwartet vom Server zurückgegeben werden, kein Array. Ein Array sollte im Falle einer Sammlung zurückgegeben werden.

Also in Ihrem Fall benötigen Sie eine parse Methode zu definieren, die Daten, die das Objekt zurückzugeben, enthält:

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

}); 
+0

Parse zusammen mit dem listenTo hat den Trick gemacht. – hesonline

1

Sie können auf das Backbone sync Ereignis auf dem Modell hören. sync Brände nach einem erfolgreichen Aufruf an den Server

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

Auch können Sie Ihr Modell App.Views.DocumentView, in der Methode initialize holen bewegen. als auf Erfolg machen Sie die Ansicht:

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

Danke Yosvel. Leider hat sich wirklich nichts geändert. Der Standardwert wird angezeigt. Der Abruf wird durchgeführt, und das Modellobjekt hat einen "geänderten" Wert, auf den ich immer noch nicht zugreifen kann. – hesonline