2

プライベート関数とヘルパー メソッドを本当にプライベートに保つ方法を見つけようとしています。各オブジェクトは、外部からの呼び出しが許可されているもののみを公開する必要があります (ラジカル、私は知っています!)。次のような方法でバックボーン ビューを使用してこれを行うのに苦労しています。

  1. 読みやすさを犠牲にしない
  2. 多くのボイラープレートを含まない
  3. 意図しない結果はありません

私の一般的なビュー構造は次のとおりです。

(function(){
    //Private function no other view needs to care about
    var addStuffToMyDom = function(model){
        var newView = new Subview({model: model});

        //Problem: this doesn't refer to the 'view' here
        this.$el.append(newView.render().$el);
    }

    //Another trivial function which should really be private
    var doSomeThingTrivial = function(){
        this.$el.addClass("meh");
    }

    return BaseView.extend({
        events: {
            "click": doSomeThingTrivial
        },

        render: function(){
            var me = this;
            this.collection.each(addStuffToMyDom);
            return this;
        }
    });
 }());

ご覧のとおり、プライベート関数は「this」を参照して自分自身を追加することはできません。

解決策 1:

(function(){
    var me;

    ...

    return BaseView.extend({
        initialize: function(){
            me = this;
        }
    });
}());

これには多くの微妙な副作用があり、毎回これを行わなければならないのは面倒です。

解決策 2:

(function(){
    var me;

    ...

    return BaseView.extend({
        events{
            "click" : function(){
                doSomeThingTrivial.call(this);
            }
        }
    });
}());

これは機能しますが、乱雑なコードのボイラープレートがたくさんあります。

解決策 3:

(function(){
    return BaseView.extend({
            events: {..}
        initialize: function(){
            _.bindAll(this, this.events);
        }
    });
}());

私はこれが一番好きです。これは機能し、かなり読みやすく、広告どおりに機能しますが、ビューごとに 1 つの余分な手順を実行する必要があります。私が見逃している他の解決策はありますか?

4

2 に答える 2

1

each使用するコンテキストをメソッドに渡すことができます。

this.collection.each(addStuffToMyDom, this);

thisこれで の内部が表示されますaddStuffToMyDom

バックボーン イベント ハッシュを使用してイベントをフックすると、似たようなことができると思いました。this内部のビューではありませんかdoSomeThingTrivial?

Backbone を見ると、次のようになりますdelegateEvents

method = _.bind(method, this);

あなたの見解はどこthisにありますか。

于 2013-02-06T19:52:09.927 に答える
1

初期化子の _.bindAll(this) がプライベート関数のスコープの問題を修正することを発見しました。この質問をして以来、私はこのデザインパターンについてあまり確信が持てなくなりましたが、それは解決します:)

(function(){
    //Private function no other view needs to care about
    var addStuffToMyDom = function(model){
        var newView = new Subview({model: model});

        //Problem: this doesn't refer to the 'view' here
        this.$el.append(newView.render().$el);
    }

    //Another trivial function which should really be private
    var doSomeThingTrivial = function(){
        this.$el.addClass("meh");
    }

    return BaseView.extend({
        events: {
            "click": doSomeThingTrivial
        },

        initialize: function(){
            _.bindAll(this);

        }
    });
 }());
于 2013-05-12T18:43:10.890 に答える