2012-02-02 8 views
12

私は、バックボーンビューの1つでサイズ変更イベントにハンドラをアタッチしようとしています。いくつかの調査をした後、私はあなたがビューの要素またはその子孫にのみイベントを添付できることを発見しました。バックボーンを使用してビュー内のウィンドウにサイズ変更イベントを追加するにはどうすればよいですか?

これは、私が達成しようとしている視覚効果が純粋なCSSを使用することができず、いくつかのJSがウィンドウからヘッダー要素を引いたコンテンツ領域要素の寸法を設定する必要があるためです。

あなたがいないCSSの背景の策略で、残りのスペースを占有しなければならない薄いヘッダとコンテンツ領域を想像し、私がやろうとしていますどのような視覚化する問題がある場合;)

私は、コード例を添付しました。あなたが他のポインタを持っているなら、私も彼らのことを聞きたいです!

define(
    [ 
     'jQuery', 
     'Underscore', 
     'Backbone', 
     'Mustache', 
     'text!src/common/resource/html/base.html' 
    ], 
    function ($, _, Backbone, Mustache, baseTemplate) { 
     var BaseView = Backbone.View.extend({ 

      el: $('body'), 

      events: { 
       'resize window': 'resize' 
      }, 

      render: function() { 
       var data = {}; 

       var render = Mustache.render(baseTemplate, data); 

       this.$el.html(render); 

       this.resize(); 
      }, 

      resize: function() { 
       var windowHeight = $(window).height(); 

       var headerHeight = this.$el.find('#header').height(); 

       this.$el.find('#application').height(windowHeight - headerHeight); 
      } 
     }); 

     return new BaseView; 
    } 
); 

私の援助をいただければ幸いです。

ありがとう、 アレックス

答えて

25
var BaseView = Backbone.View.extend({ 

    el: $('body'), 

    initialize: function() { 
     // bind to the namespaced (for easier unbinding) event 
     // in jQuery 1.7+ use .on(...) 
     $(window).bind("resize.app", _.bind(this.resize, this)); 
    }, 

    remove: function() { 
     // unbind the namespaced event (to prevent accidentally unbinding some 
     // other resize events from other code in your app 
     // in jQuery 1.7+ use .off(...) 
     $(window).unbind("resize.app"); 

     // don't forget to call the original remove() function 
     Backbone.View.prototype.remove.call(this); 
     // could also be written as: 
     // this.constructor.__super__.remove.call(this); 
    }, ... 

ビューにremove()関数を呼び出すことを忘れないでください。ビューを別のビューに置き換えてはいけません。

+0

ありがとうございました!しかし、Backboneのイベント層の外に出るのは悪い習慣ですか? –

+1

私はあまり心配しないと言います。 resizeイベントはMVC構造体と複雑なやりとりをしないので、別のリスナーを持つだけで何かを失うことはありません – wheresrhys

+0

私のことを明確にしてくれてありがとうございます –

4

window.onresizeにカスタムイベントをトリガーさせてから、ViewsまたはModelsにそれを聞かせて、さまざまな要素に対するカスタム応答を持たせることができます。

ケース1ビューは、ウィンドウイベントを直接リッスンします。この場合には、ウィンドウ・モデルは、窓に耳を傾け:あなたは、したがって、あなたが基幹モデルでウィンドウサイズを格納し、それをあなたがそれを必要とするたびに検査せずにウィンドウのサイズを保持することをお勧めします

window.onload = function() { 

    _.extend(window, Backbone.Events); 
    window.onresize = function() { window.trigger('resize') }; 

    ViewDirect = Backbone.View.extend({ 

    initialize: function() { 
     this.listenTo(window, 'resize', _.debounce(this.print)); 
    }, 

    print: function() { 
     console.log('Window width, heigth: %s, %s', 
     window.innerWidth, 
     window.innerHeight); 
    }, 

    }); 

    var myview = new ViewDirect(); 

    } 

ケース2ビューはウィンドウモデルをリッスンします。

+0

このイベントプロセスにはモデルが含まれている理由はありますか?私は通常、ビューレイヤーイベントとしてサイズ変更を考えると思います。 – mlibby

+0

@mlibbyそれは何が変わっているかによって変わります。イベントがモデルを変更して、ビューがモデルからのイベントにのみ関与しなければならない可能性があります。 – prodaea

+1

こんにちは@ mlibby遅く再生して申し訳ありません、私はあなたの質問に気づいていませんでした。答えに編集、prodaeaが上記のように言ったことを発言する。 –

関連する問題