2012-06-11 13 views
11

イベントを自分のビューからバインド解除するだけの理由で、close prototype全体を作成する必要があるのはなぜですか?バックボーンでそれを構築してはいけませんか?ビューが削除されたときを検出する方法はありますか?バックボーンイベントを2回実行する

私のバックボーンイベントは、離れてナビゲートしてビューに戻ると2回発生します。

 events : { 
      "click #userDropdownButton > a" : "toggleUserDropdownMenu", 
      "click" : "hideUserDropdownMenuIfClickedOutside" 
     }, 

     el : "body", 

     initialize : function() { 
      this.render(); 
     }, 

     // Shows/hides the user dropdown menu 
     toggleUserDropdownMenu : function() { 
      if(!this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.showUserDropdownMenu(); 
      } else { 
       this.hideUserDropdownMenu(); 
      } 
      return false; 
     }, 
     showUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').addClass('hover'); 
      this.$el.find('#userDropdownButton > ul').show(); 
      this.$el.find('#userDropdownButton > a .arrow-down').removeClass('arrow-down').addClass('arrow-up'); 
     }, 
     hideUserDropdownMenuIfClickedOutside : function() { 
      if(this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.hideUserDropdownMenu(); 
      } 
     }, 
     hideUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').removeClass('hover'); 
      this.$el.find('#userDropdownButton > ul').hide(); 
      this.$el.find('#userDropdownButton > a .arrow-up').removeClass('arrow-up').addClass('arrow-down'); 
     }, 

ビューがレンダリングされる最初の時間は、ドロップダウンが開き、適切に閉じますが、ビューがレンダリングされる二回目には、ドロップダウンは、すべて、とすぐにそれが開くと第2のクリックが閉じを二回クリックし、そう解釈それ。

+1

私たちがあなたがしていたことを知っていたら、あなたが間違っていることをおそらく伝えることができました。見るべきコードがあれば... –

+0

@muistooshortはコードを追加しました:フィードバックのためにありがとう – Garrett

+0

私はこれをhttp://stackoverflow.com/q/10966440/479863の複製と呼びますが、少なくとも答えはほぼ同じです。 –

答えて

14

アップデート2013年5月1日:バックボーンは0.9.9+ TEH ZOMGの問題に対処する簡単容易にするために、いくつかの組み込み機能を追加しました(View.removeStopListeningを参照してください)。ゾンビを殺す必要があります。


なぜ私はちょうど私のイベントは、私の見解からunbinded持つように全体に近いプロトタイプを作成する必要がありますか?

Derick's articleこの問題全体をカバーするのはすばらしいです。しかし、私は2つのビットを追加して、なぜそれが組み込まれていないのかというあなたの質問に対処することができます。

Backboneイベント委任の仕組みのため、ビューはスコープから外れるとガベージコレクションされませんイベントバインディングこれは、イベントがバインドされているオブジェクト(Backboneオブジェクトイベントにバインドする場合はBackboneオブジェクト、イベントコールバックの場合はDOMイベントシステム)がビューの機能への参照を保持するためです。

一部のバックボーンユーザーはこの動作に依存しており、完全に範囲外になったとしても、実行していたようなイベントには自動的に応答することを期待しています。 (私はこれを行ういくつかのチュートリアルを見てきました)これは、あなたがそれへの参照を失ったので、ビューを削除する必要はない、またはビューがイベントに応答して自身を削除できると仮定しますが、あなたがその意味を理解している限り、「作成して忘れる」機能は素晴らしいものです。

mu is too shortは、UIイベントについての良い点です。 DOMからelを削除すると、委任されたイベントも削除されます。モデルやコレクションのイベントや他のバックボーンオブジェクトのイベントへのバインディングについては、同じことは言えません(どのオブジェクトでもバックボーンイベントプロトタイプを拡張できます)。これらの場合、リンクしている記事のDerick Baileyのアドバイスに従って手動でビューを閉じる必要があります。これが他のJS MVCフレームワークと比較してバックボーンの弱点であるかどうかはわかりませんが、私は他のものを徹底的に試していません。

"ビューが削除されたときを検出する方法はありますか?"

私が知っていることは直接ではありません。しかし、一般的には、ビューを削除しているコードがあれば、必要に応じてイベントバインディングもクリーンアップする必要があります。多くの場合、良好なMVCアーキテクチャでは、ビューは対応するモデルまたはコレクションにイベントオブザーバを設定し、発生したイベント(対応するモデルからの「削除」イベントなど)に基づいて自身をクリーンアップ&を削除します。ビューの削除を普遍的に「検出可能」にしたい場合は、独自のビュープロトタイプでremove関数をオーバーライドし、他の人が観察できるカスタムイベントをトリガーする方法があります。

関連する問題