2012-08-27 12 views
8

मैं एक समारोह है कि वर्तमान स्क्रीन ज्यामिति रिपोर्ट करने के लिए एक सर्वर के साथ कुछ संचार करता है, आदिknockoutjs में सदस्यता के साथ थ्रॉटलिंग को कैसे जोड़ें?

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

है मैं इस तरह मेरे कोड में कुछ घटनाओं को यह समारोह सदस्यता ली है:

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

कुछ इन घटनाओं में से सर्वर द्वारा उपयोगी रूप से संभालने के लिए अक्सर भेजा जा सकता है, और मैं अनुरोधों को कुछ उचित दर पर थ्रॉटल करना चाहता हूं।

सबसे अच्छा मैं के साथ आ सकता है

कुछ इस तरह था:

var triggerSend = ko.observable(); 

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

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

इस प्रतिरूप पर कब्जा करने का एक और अधिक संक्षिप्त तरीका है, या इस जाने का रास्ता है?

उत्तर

10

आप Underscore का उपयोग कर रहे हैं, तो आप debounce इस तरह इस्तेमाल कर सकते हैं:

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

अन्यथा, यह वास्तव में एक पैटर्न है कि नॉकआउट सीधे समर्थन करता है, नहीं है। समाधान आप आया था, काफी अच्छा लगता है, हालांकि यहां एक विकल्प है:

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

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

मानते हुए अपने viewModel.onLayoutChange एक मानने योग्य है, तो आप बस कर सकते हैं:

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

यहां शानदार जवाब! –

0

ऊपर जवाब काफी खूबसूरत है! मेरे पास एक सूची है जिसे सॉर्ट करना है, ऑर्डर और उसके बाद सर्वर को प्राथमिकता के रूप में सर्वर में सहेजने की आवश्यकता है। मैं सर्वर को 3 अलग-अलग संपत्ति परिवर्तनों पर अपडेट करना चाहता हूं लेकिन हर बदलाव पर नहीं। ऐसा कुछ कर रहा है।

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

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

मुझे एक समारोह के साथ कई गुणों की सदस्यता लेने की अनुमति देता है और सर्वर को अद्यतन करने से पहले उपयोगकर्ता को क्लिक करने से रोकने का समय देता है।

बहुत अच्छा, धन्यवाद!

संबंधित मुद्दे