2012-08-13 12 views
21

Sto tentando di utilizzare Backbone con un'API.Ignora la funzione di analisi del backbone

Il formato della risposta API di default è:

{ 
somemetadatas:xxx , 
results:yyy 
} 

Che si tratti di un'operazione di recupero per un singolo modello o una collezione.

Quindi, per quanto so di poter ignorare la funzione Backbone parse con:

parse: function (response) { 
    return response.results; 
}, 

Ma ho visto in the documentation:

parsecollection.parse(response)

parse viene chiamato da Backbone ogni volta ac i modelli di ollection vengono restituiti dal server, in fetch. La funzione passa l'oggetto response non elaborato e deve restituire l'array degli attributi del modello da aggiungere alla raccolta. L'implementazione di default è un no-op, passa semplicemente attraverso la risposta JSON. Sovrascrivi questo se hai bisogno di lavorare con un'API preesistente, o meglio lo spazio dei nomi le tue risposte. Nota che in seguito, se la tua classe modello ha già una funzione parse, verrà eseguita su ogni modello scaricato .

Quindi, se ho una risposta per una collezione recuperare così:

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

La prima funzione parse sulla raccolta estrarrà [user1,user2].

Ma il dottore dice:

Nota che poi, se la classe del modello ha già una funzione parse, verrà eseguito uno contro l'andò a prendere modello.

Così sarà cercare di trovare response.results; su user1 e user2

ho bisogno di entrambe le funzioni di parsing sul modello e la raccolta perché entrambi i modelli e di raccolta dati saranno sotto l'attributo risultato.

Ma se prendo una raccolta, non voglio che la funzione di analisi del modello sia utilizzata per un singolo elemento di matrice.


Quindi c'è una soluzione a questo problema?

penso a una soluzione in cui la mia funzione di parsing collezione trasformerà qualcosa di simile:

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

in qualcosa di simile a questo:

[ {results.user1} , {results.user2} ] 

modo che la funzione del modello di analisi non mancherà su un raccolta Ma è un po 'hacky ... c'è qualche soluzione elegante a questo problema?


Tra l'altro, come il mio API produrrà sempre risultati di questa forma, è possibile eseguire l'override di default la funzione parse di tutti i miei modelli e collezioni? (Scusate, sono un JOB noob ...)

risposta

27

È possibile verificare se i dati ricevuti sono inclusi da un membro results e reagire di conseguenza. Ad esempio,

var M = Backbone.Model.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

E un violino http://jsfiddle.net/9rCH3/

Se si vuole generalizzare questo comportamento, derivano tutte le classi del modello da questa classe di base o di modificare il prototipo di backbone per fornire questa funzione:

Backbone.Model.prototype.parse = function (data) { 
    if (_.isObject(data.results)) { 
     return data.results; 
    } else { 
     return data; 
    } 
}; 

http://jsfiddle.net/9rCH3/1/

+0

grazie cercheranno che –

+0

mia abitudine 'parse' si chiama, ma non ha alcun effetto - i valori nel modello sono solo l'ID iniziale, che è stato fornito nel costruttore ... Qualsiasi idee? – Dor

+0

Se stai provando a fare cose sui tuoi id modello, non puoi farlo dalla versione 1.1.0. http://backbonejs.org/#changelog Se non è così, dovrai pubblicare una domanda. – nikoshr

1

Parse anche deve essere implementato nel Collecti sopra.

var EgCollection = Backbone.Collection.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

http://backbonejs.org/#Collection-parse

Problemi correlati