12

イベントをビューからバインド解除するためだけに、プロトタイプ全体を作成する必要があるのはなぜですか? Backbone はそれを組み込むべきではないでしょうか? ビューが削除されていることを検出する方法はありますか?

ナビゲートしてビューに戻った後、バックボーン イベントが 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 回目にビューがレンダリングされると、ドロップダウンはすべてのクリックを 2 回解釈するため、開くとすぐに 2 回目のクリックで閉じます。

4

1 に答える 1

15

アップデート2013/05/01:Backbone 0.9.9+には、zomgの問題に簡単に対処できるようにするための組み込み機能が追加されています(View.removeおよびStopListeningを参照)。ただし、これらのいずれかを呼び出してゾンビを殺す必要があります。


イベントをビューからバインド解除するためだけに、完全に近いプロトタイプを作成する必要があるのはなぜですか?

デリックの記事は、この問題全体をカバーするのに優れています。しかし、「なぜ」が組み込まれていないというあなたの質問に対処するために、2つのビットを追加することができます。

バックボーンイベント委任が機能する方法のため、ビューがイベントバインディングを持っている場合、ビューがスコープ外になったときにガベージコレクションされません。これは、イベントがバインドされるオブジェクト(Backboneオブジェクトイベントにバインドする場合はBackboneオブジェクト、「イベント」コールバックの場合はDOMイベントシステム)がビューの関数への参照を維持するためです。

信じられないかもしれませんが、一部のBackboneユーザーはこの動作に依存しており、ビューが完全に範囲外になった場合でも、指示されたとおりにイベントに自動応答し続けることを期待しています。(これを行うチュートリアルをいくつか見てきました。)これは、ビューを削除する必要がないこと、またはビューへの参照を失ったためにビューがイベントに応答してそれ自体を削除できることを前提としていますが、IMO、これ '意味を理解している限り、作成して忘れる機能は素晴らしいです。

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

「ビューが削除されていることを検出する方法はありますか?」

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

于 2012-06-11T23:00:31.543 に答える