2012-08-27 12 views
8

Ho una funzione che esegue una certa comunicazione con un server di segnalare la geometria schermata corrente, eccCome combinare la limitazione con la sottoscrizione in knockoutjs?

function sendScreenLayout() { 
     logElementLocations(exp.getPageCoordinates()); 
    }; 

Sottoscrivo questa funzione per alcuni eventi nel mio codice come questo:

viewModel.onLayoutChange.subscribe(sendScreenLayout); 
$('#right-splitter > #mainContent').resize(sendScreenLayout); 
$(window).resize(sendScreenLayout); 
... 
setTimeout(sendScreenLayout, 1); 

Alcuni di questi eventi può essere inviato troppo spesso per essere gestito utilmente dal server, e vorrei limitare le richieste ad un tasso ragionevole.

il meglio che potevo venire con era qualcosa di simile:

var triggerSend = ko.observable(); 

ko.computed(function() { 
    triggerSend(); 
    logElementLocations(exp.getPageCoordinates()); 
}).extend({throttle: 200}); 

function sendScreenLayout() { 
    triggerSend.valueHasMutated(); 
} 

Esiste un modo più succinta di catturare questo schema, o è la strada da percorrere?

risposta

10

Se si utilizza Underscore, si potrebbe usare debounce come questo:

var sendScreenLayout = _.debounce(function() { 
    logElementLocations(exp.getPageCoordinates()); 
}, 200); 
... 
$(window).resize(sendScreenLayout); 
... 

In caso contrario, non è davvero un modello che Knockout sostiene direttamente. La soluzione si avvicinò sembra abbastanza buona, anche se qui è un'alternativa:

var triggerSend = ko.computed({ 
    read: function() {}, 
    write: function(dummy) { 
     logElementLocations(exp.getPageCoordinates()); 
    } 
}).extend({throttle: 200}); 

function sendScreenLayout() { 
    triggerSend(true); 
} 
3

Assumendo che il viewModel.onLayoutChange è un osservabile, si può semplicemente fare:

ko.computed(function() { 
    viewModel.onLayoutChange(); //implicitly subscribes this callback to changes 
    logElementLocations(exp.getPageCoordinates()); 
}).extend({throttle: 200}); 
+0

Ottima risposta qui! –

0

La risposta di cui sopra è molto elegante! Ho una lista che deve essere ordinata, l'ordine e ciò che deve essere salvato sul server come preferenza dell'utente. Voglio aggiornare il server su 3 diverse modifiche alle proprietà ma non su ogni modifica. fare qualcosa del genere

ko.computed(function() { 
    self.sort.direction(); 
    self.sort.order(); 
    self.sort.groupByPIC(); 

    if (!_firstLoad) { 
     _dataService.updateSortPreferences({ 
      model : new _jsSortModel(self.sort) 
     }); 
    } 
}).extend({ throttle: 2000 }); 

mi permette di pedice a un certo numero di proprietà con una funzione e dare all'utente il tempo di fermarsi cliccando turno prima di aggiornare il server.

molto bello, grazie!

Problemi correlati