2012-03-15 7 views
5

State provando a farlo funzionare per un po 'di tempo. Fondamentalmente ho una pausa come backend che restituisce json, tutto bene.fetchRelated to get related related

Il problema che ho è con backbone-relazionale. Sono sicuro che ho appena ricevuto qualcosa di ma ho cercato le reti per un po 'e non ho trovato nulla per aiutare.

Sto cercando di ottenere una relazione tra il modello "Professione" e "Arma". Ecco il mio codice per questo:

Profession = Backbone.RelationalModel.extend({ 
    urlRoot: '../api/professions', 

    relations: [{ 
     type: Backbone.HasMany, 
     key: 'weapons', 
     relatedModel: 'Weapon', 
     collectionType: 'Weapons', 
     reverseRelation: { 
      key: 'profession', 
      includeInJSON: 'id', 
      keySource: 'profession_id' 
     } 
    }] 
}); 

Weapon = Backbone.RelationalModel.extend({ 
    urlRoot: '../api/weapons' 
}); 
Weapons = Backbone.Collection.extend({ 
    model: Weapon, 

    url: function(models){ 
     return '../api/weapons'; 
    } 
}); 

E una chiamata ai punti finali API restituisce:

{name: "Profession1", id: 1} 

[{name: "Weapon1", profession_id: 1}, {name: "Weapon2", profession_id: 1}] 

Quindi, se ho capito bene una profession.fetchRelated('weapons') dovrebbe inviare una HttpRequest per l'url per la raccolta di armi e tirare l'oggetto che hanno una profession_id di 1. Ma non succede nulla quando ho eseguito profession.fetchRelated('weapons')

risposta

9

Quindi, se ho capito bene una profession.fetchRelated ('arma s ') dovrebbe inviare una HttpRequest per l'URL per la raccolta di armi e tirare l'oggetto che hanno una profession_id di 1. Ma non succede nulla quando ho eseguito profession.fetchRelated (' armi)

Questo non è come mi Capisco che Backbone-relazionale funzioni, con l'avvertenza che sto lavorando con una versione precedente e che non ho ancora studiato le ultime versioni.

Dalla mia comprensione, Backbone-relazionale richiede dati che sembrano diversi dalle risposte API.

penso che Backbone-relazionale vuole riferimenti a modelli annidati nella risposta modello di genitore, in tutto nidificato:

{ 
    name: "Profession1", 
    id: 1, 
    weapons: [ 
    {name: "Weapon1", profession_id: 1}, 
    {name: "Weapon2", profession_id: 1} 
    ] 
} 

In questo caso, sarà compilare tutti i modelli annidati.

Oppure, come riferimenti:

{ 
    name: "Profession1", 
    id: 1, 
    weapons: ['weapon1','weapon2'] 
} 

In tal caso backbone relazionale potranno riporre le chiavi sono collegati internamente, ma presentare un insieme vuoto. Si potrebbe quindi utilizzare fetchRelated per recuperare i dati completi per i modelli correlati:

assassin.fetchRelated('weapons') 

che fanno una richiesta di armi con ID 'weapon1' e 'weapon2', sia come singole richieste, o se il vostro API accetta una richiesta di set, un unico richiesta, in attesa di un qualcosa di risposta del tipo:

{id: 'weapon1', name: "Weapon1", profession_id: 1} 

non, al largo della parte superiore della mia testa, sapere se c'è un modo rapido built-in per lavorare con le tue risposte API, altri poi di scrivere un custom funzione.

+0

Grazie per il chiarimento. Forse dovrei solo cambiare la risposta dell'API per includere i modelli annidati come voglio che siano disponibili non appena viene recuperata la "professione". – JonasFromell

+0

Il problema che incontro è quando si hanno dozzine di professioni, ciascuna con dozzine di armi leggermente sovrapposte. Includere l'oggetto arma completo con ogni professione porta a cumuli di dati ridondanti. È ottimo per questo piccolo esempio, ma per un'applicazione di grandi dimensioni, non del tutto fattibile. –

2

Per aggiungere a ciò che Edward ha scritto, ecco come è possibile ottenere fetchRelated per funzionare. Innanzitutto, come ha affermato Edward, fetchRelated non restituirà nulla se la tua API annida già i dati nella risposta JSON.Quindi, se in Django-Tastypie avete la vostra risorsa impostato per l'uso completa = True:

movies = fields.ToManyField('movie.api.MovieResource', 'user', full=True) 

poi qualcosa di simile,

myuser.fetchRelated("movies") 

restituirà nulla perché i dati relativi saranno già inclusi nella Risposta JSON. Ma dove il recupero correlato è particolarmente utile è quando si sta tentando di eseguire un caricamento lento. Quindi, se hai pieno = Falso nel tuo campo Django-Tastypie e la tua risposta JSON include solo l'id dell'ID e della risorsa a quella voce, puoi usare fetchRelated per popolare effettivamente quei dati.

myuser = new User({id: 1}) 
myuser.fetch() 
myuser.fetchRelated("movies") 

E ora si ha accesso alla collezione di film correlati. Se si utilizza anche il plug-in Tastypie-Backbone, non è necessario preoccuparsi di creare una dichiarazione di ritorno URL speciale nella raccolta. Fa tutto per te usando la sintassi select di tasteypie di/2; 3; 7

Problemi correlati