1

次の状況を処理するための最良の方法は何だろうと思っています。ビューにそれぞれ関連付けられるレコードのコレクションがあるとします。各ビューには、特定の機能を実行するボタンがあります。議論のために、ページには一度に最大 100 のビューが存在する可能性があります。このビューの例を以下に示します。

var RecordView = Backbone.View.extend({
    events: {
        'click .js-cta': 'onCTAClick'
    },
    onCTAClick: function(event) {
        // Do something.
    }
});

これは明らかに 100 の DOM リスナーをバインドし、必要以上に多くのメモリを占有します。これを処理する 1 つの方法は、コレクションのビューを作成し、そのレベルに委任されたリスナーを 1 つ配置することです。これにより、どのビューに通知するかを決定し、次のようにイベントをトリガーします。

var CollectionView = Backbone.View.Extend({
    events: {
        'click .js-cta': 'onCTAClick'
    },
    onCTAClick: function(event) {
        // Use event data to determine appropriate child view to notify.
        // Notify the child view by triggering an event on it (childView.trigger('CTAClick')).
    }
});

var RecordView = Backbone.View.Extend({
    initialise: function() {
        this.on('CTAClick', this.onCTAClick);
    },
    onCTAClick: function(event) {
        // Use event data to determine appropriate child view to notify.
        // Notify the child view by triggering an event on it (childView.trigger('')).
    }
});

これは 100 以上の DOM リスナー メソッドよりも優れているのではないでしょうか... DOM リスナーは 1 つしかありませんが、RecordView には 100 のリスナーがイベントの通知を待っています。DOM イベントリスナーはバックボーンイベントリスナーよりも「重い」ですか? リスナーを完全に削除し、CollectionView でメソッドを直接トリガーして、リスナーを 1 つに減らすこともできますが、これはビューを緊密に結合します。これらの 2 つのビューが機能的に非常に近く、とにかくほとんど織り交ぜられている場合、この緊密な結合は問題になりますか?

この状況にアプローチする正しい方法は何ですか?

4

1 に答える 1

1

IMOH 正しい方法はないと思います。あなたが概説する両方のアプローチが機能します。ただし、多くのビューを処理する場合、メモリの観点からは、DOM バブリングを利用する委譲メソッドが最適です。このアプローチでは、レコード ビュー DOM にレコード ビューの ID をデータ属性として格納し、この ID に対するビューのマップをコレクション ビューに格納する傾向があるでしょう。次に、メソッドを直接呼び出します。密結合であることを心配する必要はありません。

于 2013-11-14T08:27:13.157 に答える