2015-10-14 25 views
11

Ho esaminato più post su come salvare una raccolta Backbone utilizzando un server non RESTful e sono ancora un po 'confuso. Ho creato una raccolta in cui ho sovrascritto il metodo toJSON per personalizzare i miei dati per la pubblicazione sulla mia API ("/api/entity/735/request/personDelete" attualmente scambiato per jsfiddles/echo/json). Quindi ho creato un metodo save che utilizza Backbone.sync, su success Sto disconnettendo qualsiasi tipo di risposta e l'oggetto è vuoto, non sono sicuro dove le cose si perdono o cosa sto facendo male; qualcuno può darmi qualche consiglio? Vorrei solo fare in modo che questo esempio funzioni in modo da poter usare qualcosa di simile in futuro.Backbone: salvataggio di un'intera raccolta su un server non RESTful

JS

var PersonCollection = Backbone.Collection.extend({ 
    model: PersonModel, 

    url: function() { 
     // Dummy JSFiddle endpoint 
     // Example non-RESTful url "/api/entity/735/request/personDelete" 
     return '/echo/json/'; 
    }, 

    /** 
    * Override toJSON to loop through collection models making 
    * custom objects containing specific attributes to be posted. 
    */ 
    toJSON: function() { 
     console.log(this.models); 

     var plucked = this.models.map(function(model) { 
      return _.pick(model.toJSON(), ["id","name", "teams"]) 
     }); 

     console.log(plucked); 
     return plucked; 
    }, 

    save: function(options) { 
     Backbone.sync('create', this, { 
     success: function(data, textStatus, jqXHR) { 
      console.log('Saved!', data); 
     } 
     }); 
    } 
}); 

JSFiddle:http://jsfiddle.net/kyllle/f1h4cz7f/3/

+0

controllo Plase se la richiesta viene fatta, i parametri vengono passati come previsto (cosa di cui dubito) e si ottiene una risposta 2xx. Modifica il tuo post e specifica come dovrebbe apparire una richiesta (ad esempio form-encoded o application/json ecc.). Direi che l'evento 'Backbone.sync()' potrebbe non essere adatto alle tue esigenze. Probabilmente vorrai usare '$ .ajax()' direttamente in 'save()' oppure, se hai più modelli e collezioni che comunicano con quell'API REST "non standard" potresti sovrascrivere 'Backbone.sync() invece. –

+0

Questa è una parte del mio problema in questo momento, non sono sicuro di dove o come ho bisogno di passare i parametri in modo che il salvataggio possa essere eseguito in modo efficace? – styler

+1

Hai davvero intenzione di salvare tutto all'interno della collezione? So che hai detto che il tuo back-end non è RESTful, ma che cosa si aspetta il tuo back-end? e come si aspetta json? –

risposta

7

Non devi sforzarti di utilizzare sync se non ti aiuta. sync è lì per farti risparmiare tempo in scenari comuni.

Come si può vedere nel annotated sync code, alla fine si chiama solo jQuery.ajax e include la logica per aiutare con i backend RESTful.

Inoltre si innesca alcuni eventi, che si potrebbe o non potrebbe ascoltare in altre parti della vostra applicazione, come request (quando è stata fatta la richiesta) e sync (quando la richiesta è stata completata con successo), o error (se la richiesta failed)

Tutto ciò che puoi fare dalla tua app, se reinventare sync non è eccitante.

Prepara i tuoi dati, chiama $.ajax per inviare i dati al tuo back-end, e opzionalmente trigger gli eventi di backbone, se hai intenzione di ascoltarli.

+0

Sì, capisco perfettamente da dove vieni, ma ho pensato che potevo combinare toJSON e sincronizzarlo per farlo in modo più elegante. – styler

0

È possibile avvolgere la raccolta in un modello di dorsale.

var CollectionWrapper = Backbone.Model.extend({ 
    url: "/echo/json" 
}); 

e quindi è possibile utilizzare model.save() e/o Backbone.sync() come colonna portante intende di essere utilizzato.

Vai a questa risposta: "How" to save an entire collection in Backbone.js - Backbone.sync or jQuery.ajax?

+0

Questo è piuttosto un commento. A parte questo, l'OP chiede come gestire le API (REST) ​​che non seguono il principio di Backbone. Dice "un server non RESTful" e "/ api/entity/735/request/personDelete" 'sembra più simile al verbo (azione) che viene riflesso dai componenti URL, non dai verbi HTTP. Immagino che l'OP abbia già capito che deve sovrascrivere 'save()' o 'sync()' ma non è sicuro di come farlo. –