2012-06-01 13 views
9

Mam mixin, który automatycznie przelicza i ustawia wysokość div na rozmiar strony.Jak powiązać funkcję okna w widoku Ember?

Działa, ale wydaje mi się głupie, że wiążę się ze zdarzeniem jQuery i ręcznie inicjuję zdarzenie Ember za każdym razem, gdy jest wywoływane.

Czy istnieje sposób powiązania zdarzeń okna bezpośrednio w Ember?

mam uproszczony JSFiddle here

Jest to kod:

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') 
) 

A mixin że woła go.

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

Nie musiałby się obiekt' = this' jeśli użyto strzałkę tłuszczu ('=>') podczas rejestracji obsługi zdarzeń. – ebryn

Odpowiedz

7

Nie ma nic złego w rejestrowaniu własnego programu obsługi zdarzeń za pomocą jQuery w podobny sposób.

Ember nie ma obecnie żadnej obsługi zdarzeń w oknie.

Proponuję również wymyślić rozwiązanie, które nie zależy od globaliów.

0

Nie sądzę, że to możliwe z ember.js - jedyne miejsce, gdzie zapewnia wbudowany obsługi zdarzeń DOM jest Ember.View (kliknij, itd.) I być może w innych klasach widoku powiązane.

Zastosowaliśmy również podobne podejścia do rozwiązania w celu obsługi specjalnych przypadków takich jak to!

11

Wiem, że kilka lat późno, ale szukałem rozwiązania tego samego problemu i znalazłem to:

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

(źródło: Ember.js ofiicial)

**** PS: O implementacji tej małej sztuczki - nie wiem czy możliwe jest użycie jej w metodzie sterownika i wyzwalanie init (jak skomentował denis.peplin), faktycznie wiążę zdarzenie w funkcji 'setupController' trasy . Nie wiem, czy to najlepsza praktyka, ale działa jak urok w mojej aplikacji.

+1

Tak, i jak można go rozwiązać, gdy już się z tym wiąże ...? –

2

I przykładowy kod dla Itay Hamashmid „s odpowiedź:

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: Funkcja bindResizeEvent jest wywoływana w init, ale gdy zmieniam rozmiar przeglądarki Chrome, funkcja nie działa ponownie. Oczekiwane zachowanie bindResizeEvent polega na tym, że byłby uruchamiany za każdym razem, gdy zmieni się rozmiar okna przeglądarki (tego właśnie szukam)? –

+0

Tak, i jak można go rozwiązać, gdy już się zetkniesz ...? –

Powiązane problemy