2012-08-27 8 views
8

Mam funkcję, która wykonuje jakąś komunikację z serwerem zgłaszania aktualną geometrię ekranu itpJak połączyć dławienie z subskrypcją w knockout-ie?

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

I subskrybować tę funkcję do niektórych zdarzeń w moim kodu tak:

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

Some z tych wydarzeń może być wysyłany zbyt często, aby mógł być użytecznie obsługiwany przez serwer, a ja chciałbym ograniczyć żądania do rozsądnej stawki.

Najlepszym mogę wymyślić było coś takiego:

var triggerSend = ko.observable(); 

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

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

Czy jest bardziej zwięzły sposób robienia tego wzoru, czy jest to do zrobienia?

Odpowiedz

10

Jeśli używasz Underscore, można użyć debounce takiego:

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

W przeciwnym razie, to naprawdę nie jest to wzór, który Knockout obsługuje bezpośrednio. Rozwiązanie ty wymyślił wydaje się wystarczająco dobre, chociaż tutaj jest alternatywa:

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

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

Zakładając, że viewModel.onLayoutChange jest obserwowalny, można po prostu zrobić:

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

Świetna odpowiedź tutaj! –

0

Powyższa odpowiedź jest dość elegancki! Mam listę, która musi zostać posortowana, kolejność i co do tego należy zapisać na serwerze jako preferencję użytkownika. Chcę zaktualizować serwer na 3 różnych zmianach właściwości, ale nie przy każdej zmianie. robienie czegoś takiego.

Pozwala mi na zasubskrybowanie wielu właściwości za pomocą jednej funkcji i daje użytkownikowi czas na zakończenie rundy przed aktualizacją serwera.

bardzo ładne, dziękuję!