2012-06-01 7 views
9

私は自動的に再計算し、ページのサイズ変更時にdivの高さを設定するmixinを持っています。Ember Viewのウィンドウ関数にどのようにバインドする必要がありますか?

これは動作しますが、jQueryイベントにバインドして呼び出されるたびに手動でEmberイベントをトリガするのは私にとっては馬鹿しく思えます。

Emberに直接ウィンドウイベントにバインドする方法はありますか?

私は簡素化JSFiddle hereを持って

これはコードです:

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。

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

。 – ebryn

答えて

7

jQueryで独自のイベントハンドラを登録する際に、このようなことは何も問題ありません。

Emberには現在ウィンドウイベント処理がありません。

また、グローバルに依存していないソリューションを考え出すことをお勧めします。

0

私はそれがEmber.jsでは可能だとは思わない - DOMイベント処理に建てられ、それが提供する唯一の場所はEmber.Viewのためである(などをクリック)と、おそらく他のビュー関連のクラスで。

また、このような特殊なケースを処理するために、同様のアプローチを使用しました。

11

私は後半の数年間だ知っているが、私は同じ問題への解決策を探していたし、この発見:

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

(ソース:Ember.js ofiicial

**** P.S.を この小さなトリックの実装について - コントローラーメソッドでそれを使用し、init(denis.peplinがコメントしたもの)でトリガーできるかどうかわかりませんが、実際にはルートの 'setupController'関数でイベントをバインドしています。私はそれがベストプラクティスかどうかわからないが、それは私のアプリの魅力のように動作します。

Itay Hamashmidの答えについて
+1

はい、バインドしたらどのようにアンバインドしますか? –

2

とサンプルコード:あなたのイベントハンドラを登録するときに( `=>`)脂肪の矢印を使用している場合は、 `オブジェクト= this`を必要としない

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:initで関数bindResizeEventが呼び出されますが、Chromeブラウザのサイズを変更しても関数は再び実行されません。 bindResizeEventの予想される動作は、ブラウザウィンドウがサイズ変更されるたびに実行されることです(これは私が探しているものです)。 –

+0

はい、バインドしたらどのようにアンバインドしますか? –

関連する問題