2013-10-04 9 views
7

Desidero sovrascrivere il metodo di recupero nei modelli e nelle raccolte per il recupero dei dati da localstorage in assenza di connessione di rete.Sovrascrivi il metodo di recupero in backbone

Questa è una funzione fetch all'interno di una collezione

fetch:function(){ 
    if(online){ 
     return Backbone.Collection.prototype.fetch.call(this) ; 
    }else{ 
    // return Backbone.Collection.fetch event - with data from localstorage 
    } 
} 

sto affrontando 2 problemi qui

a.The successo né funzione di errore non sono stati eseguiti

this.collection.fetch({ 
    success: function(data){ ... }, 
    error: function(){ ... } 
}); 

b. Se non vi è alcuna connessione come impostare i dati per la raccolta in modo che io possa accedervi in ​​funzione di successo

risposta

3

Dopo la ricerca che ho trovato la risposta per un problema .

fetch:function(options){ 
    if(navigator.onLine){ 
     return Backbone.Collection.prototype.fetch.apply(this, options) ; 
    }else{ 
    return //Trying to findout 
    } 
} 

Dopo aver superato argomento di opzioni per andare a prendere la funzione e gli argomenti a fetch.apply saremo in grado di accedere alla funzione di successo dalla funzione chiamante

4

Provare qualcosa come questo. $ .ajax restituisce una promessa così si dovrebbe essere in grado di effettuare le seguenti operazioni

fetch:function(){ 
    var dfd = new jQuery.Deferred(); 
    if(this.online){ 
     return Backbone.Collection.prototype.fetch.call(this) ; 
    }else{ 
    // Do your logic for localstorage here 
    dfd.resolve(); 
    } 

    return dfd.promise(); 
} 

Quindi è possibile utilizzare il vostro esempio di sopra o come preferisco

this.collection.fetch().then(function() { 
    console.log('Successfully fetched from localstorage or server.'); 
}); 
1

Potrebbe avere più senso di ignorare la sincronizzazione di Backbone() metodo per coprire anche il salvataggio e la modifica. Se si utilizza la memorizzazione locale fornito da backbone.localStorage.js, la tua sostituzione potrebbe essere simile a questo:

Backbone.sync = function(method, model, options, error) { 
    if(navigator.onLine){ // Or, however you determine online-ness 
     return Backbone.ajaxSync.apply(this, [method, model, options, error]); 
    } 
    return Backbone.localSync.apply(this, [method, model, options, error]);   
} 

non ho provato questo fuori, ma spero che si ottiene l'idea. Non dimenticare di definire una proprietà localStorage sui tuoi modelli e collezioni.

Problemi correlati