プライベート関数とヘルパー メソッドを本当にプライベートに保つ方法を見つけようとしています。各オブジェクトは、外部からの呼び出しが許可されているもののみを公開する必要があります (ラジカル、私は知っています!)。次のような方法でバックボーン ビューを使用してこれを行うのに苦労しています。
- 読みやすさを犠牲にしない
- 多くのボイラープレートを含まない
- 意図しない結果はありません
私の一般的なビュー構造は次のとおりです。
(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 つの余分な手順を実行する必要があります。私が見逃している他の解決策はありますか?