2012-06-01 8 views
9

मेरे पास एक मिश्रण है जो स्वचालित रूप से पुन: गणना करता है और पृष्ठ आकार पर एक div की ऊंचाई सेट करता है।एम्बर व्यू में विंडो विंडो को कैसे बांधना चाहिए?

यह काम करता है लेकिन यह मुझे एक jQuery घटना के लिए बाध्यकारी होने के लिए मूर्खतापूर्ण लगता है और हर बार इसे एम्बर ईवेंट को मैन्युअल रूप से ट्रिगर करने के लिए मूर्खतापूर्ण लगता है।

क्या एम्बर में सीधे खिड़की की घटनाओं से जुड़ने का कोई तरीका है?

App.windowWrapper = Ember.Object.create(Ember.Evented, 
    resizeTimer: null 
    init: -> 
    @_super() 
    object = this 
    $(window).on 'resize', -> 
     window.clearTimeout(object.resizeTimer) 
     object.resizeTimer = setTimeout(App.windowWrapper.resize, 100) 
     true 

    resize: -> 
    App.windowWrapper.fire('resize') 
) 

और mixin है कि यह बुला:

मैं एक सरलीकृत JSFiddle here

इस कोड है।

App.Scrollable = Ember.Mixin.create 
    classNames: "scrollable" 
    init: -> 
    Ember.assert("Scrollable must be mixed in to a View", this instanceof Ember.View) 
    @_super() 

    didInsertElement: -> 
    @_super() 
    @calculateHeight() 
    App.windowWrapper.on('resize', this, 'calculateHeight') 

    willDestroyElement: -> 
    App.windowWrapper.off('resize', this, 'calculateHeight') 
    @_super() 

    calculateHeight: -> 
    offset  = @$().offset().top 
    windowHeight = $(window).height() 
    @$().css('height', windowHeight - offset) 
+0

आप = 'वस्तु की जरूरत नहीं होगी this' यदि आप एक वसा तीर का इस्तेमाल किया (' => ') जब अपने घटना हैंडलर पंजीकृत। – ebryn

उत्तर

7

इस तरह के कुछ के लिए jQuery के साथ अपना खुद का ईवेंट हैंडलर पंजीकृत करने में कुछ भी गलत नहीं है।

एम्बर में वर्तमान में कोई विंडो ईवेंट हैंडलिंग नहीं है।

मैं सुझाव देता हूं कि ऐसे समाधान के साथ आने का प्रयास करें जो ग्लोबल्स पर भरोसा न करे।

0

मैं इसे Ember.js साथ संभव है नहीं लगता है - केवल जगह है जहाँ यह डोम घटना से निपटने में बनाया प्रदान करता है Ember.View के लिए है (क्लिक आदि) और शायद अन्य दृश्य संबंधित कक्षाओं में।

हमने इस तरह के विशेष मामलों को संभालने के लिए आपके समाधान के समान दृष्टिकोण भी उपयोग किए हैं!

11

मैं जानता हूँ कि मैं कुछ साल देर हो रही है, लेकिन मैं एक ही समस्या के समाधान के लिए देख रहा था और यह पाया:

jQuery(window).on('resize', Ember.run.bind(this, this.handleResize)); 

(स्रोत: Ember.js ofiicial)

**** पी.एस. इस छोटी सी चाल के कार्यान्वयन के बारे में - मुझे नहीं पता कि नियंत्रक विधि में इसका उपयोग करना संभव है और इनिट (जैसे denis.peplin टिप्पणी के रूप में) पर ट्रिगर करना है, मैं वास्तव में मार्ग के 'सेटअप नियंत्रक' फ़ंक्शन में ईवेंट को बाध्य कर रहा हूं । मुझे नहीं पता कि यह सबसे अच्छा अभ्यास है, लेकिन यह मेरे ऐप में एक आकर्षण की तरह काम करता है। Itay Hamashmid के जवाब के लिए

+1

हां, और इसे बाध्य करने के बाद आप इसे कैसे बाध्य करते हैं ...? –

2

और नमूना कोड:

App.ApplicationController = Ember.Controller.extend({ 
    handleResize: function() { 
    console.log('resized'); 
    }, 
    bindResizeEvent: function() { 
    jQuery(window).on('resize', Ember.run.bind(this, this.handleResize)); 
    }.on('init') 
}); 
+1

denis.peplin: फ़ंक्शन bindResizeEvent को init पर कॉल किया जाता है लेकिन जब मैं क्रोम ब्राउज़र का आकार बदल रहा हूं, तो फ़ंक्शन दोबारा नहीं चलता है। BindResizeEvent का अपेक्षित व्यवहार यह है कि जब भी ब्राउजर विंडो का आकार बदलता है तो यह हर बार चलता है (यह वही है जो मैं ढूंढ रहा हूं)? –

+0

हां, और इसे बाध्य करने के बाद आप इसे कैसे बाध्य करते हैं ...? –

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