2011-10-13 14 views
8

In Backbone JS quando richiamo una collezione dovrei recuperare l'intera raccolta o una piccola parte di essa?BackboneJS: carica più elementi in una raccolta

Ad esempio, ho raccolte di feed di notizie in mongoDB che potrebbero avere potenzialmente 1000 di elementi. Quando l'utente raggiunge la pagina, voglio solo mostrargli gli ultimi 10 elementi con l'opzione "Carica altro". Ma se visitano un elemento specifico tramite l'URL http://site.com/#/feed/:itemID, voglio poter recuperare il record di quell'elemento.

1. Quanti documenti devo caricare inizialmente?

2. Come posso ottenere il recupero di un oggetto tramite ID?

risposta

3

1 - Si dovrebbe essere recuperando 10

Aggiungere un argomento pagina alla tua collezione e hanno il codice backend restituire la corrispondente pagina (10/pagina). ?/My_objects page = 2 per ottenere record 10-20 ecc

A tale scopo, come questo (non testata):

collection.fetch({data: {page:2}}) 

O si modifica l'URL direttamente

2 - Per recuperare un elemento per ID si crea il modello

object = new Model({id: 1}) 

prenderla

object.fetch() 
+0

** ** 1 Ok destra in modo è necessario solo per avere i dati che sono attualmente sulla pagina in vostre collezioni spina dorsale? ** 2. ** Per scaricare un modello dal back-end devo prima crearlo usando l'ID rilevante e quindi chiamare fetch. Questo innescherà un evento "aggiungi" su quella raccolta? O per quanto riguarda Backbone, il modello non è in collezione? – wilsonpage

+0

Anche qual è l'argomento "pagina" di cui parli? È questa la funzione che ha costruito l'attributo 'url'? per esempio. 'url: function() {return x +"/"+ y +"/"+ z;' – wilsonpage

+0

1. Giusto. 2. No, dovrai aggiungerlo alla raccolta pertinente. 3. Puoi usare gli attributi url, ma penso che nelle versioni più recenti di backbone puoi inviare opzioni alla chiamata ajax con fetch, refresh ecc. Fetch ({data: "la tua query qui"}) – Julien

5

Probabilmente non si desidera utilizzare solo Collection.fetch(), perché non si otterrà il vantaggio della memorizzazione nella cache sul lato client: eliminerà gli elementi già caricati dal server e verrà ripristinata la raccolta. Probabilmente dovrai estendere lo Backbone.Collection con una funzione personalizzata per recuperare più oggetti. Ho usato il seguente codice in un recente progetto:

Backbone.Collection.extend({ 

    // fetch list without overwriting existing objects (copied from fetch()) 
    fetchNew: function(options) { 
     options = options || {}; 
     var collection = this, 
      success = options.success; 
     options.success = function(resp, status, xhr) { 
      _(collection.parse(resp, xhr)).each(function(item) { 
       if (!collection.get(item.id)) { 
        collection.add(item, {silent:true}); 
       } 
      }); 
      if (!options.silent) collection.trigger('reset', collection, options); 
      if (success) success(collection, resp); 
     }; 
     return (this.sync || Backbone.sync).call(this, 'read', this, options); 
    } 

}); 

Questo è in gran parte copiato dal codice predefinito fetch(), ma invece di cadere elementi esistenti si aggiungerà di nuovi. Probabilmente vorresti implementare qualcosa sul lato server, usando l'oggetto options come Julien suggerisce di passare i parametri di quali elementi vuoi caricare, probabilmente un numero di pagina (se vuoi controllare le dimensioni della pagina sul server) o una coppia start-stop (se si desidera controllarla sul client).

+0

Grazie! Questo mi ha aiutato molto! –

13

Ho finito per utilizzare l'istruzione {add: true} quando si chiama fetch sulla mia raccolta. Ciò impedisce che la raccolta venga sostituita dal risultato del recupero e invece aggiunge il risultato alla raccolta. Poi ho anche passato l'importo "salta" utilizzando lo {data: {skip: amountOfItemsInCollectionAlready }, questo viene utilizzato sul lato server per ottenere il batch corretto di elementi dal database.

Il mio metodo recuperare finale assomiglia a questo:.

loadMore: function(e){ 

     this.collection.fetch({ 
      add: true,// this adds to collection instead of replacing 
      data:{// this is optional params to be sent with request 
       skip: this.collection.length// skip the number of items already in the collection 
      } 
     }); 
    } 
+0

Mi stavo chiedendo se questo fosse il modo preferito per farlo! Le altre opzioni sembravano più lavoro del necessario. – Crisfole

+20

Solo una nota per gli utenti Backbone 0.9.10: fetch() non accetta più l'opzione 'add: true'. Puoi comunque ottenere la stessa cosa con '{update: true, remove: false}' – webXL

Problemi correlati