私は、ビューがイベントに正しくバインドされているかどうかをテストする際にいくつかの面白い試練がありました。バックボーンでは、通常、initializeメソッドのイベントにバインドします。something.bind("change", this.render);
の行に沿って何かを使用します。私のテストでは、このバインディングが設定されていることを確認したいので、次のようにしました:jasmineを使用したbackbone.jsアプリケーションのテスト - ビューのモデルバインディングのテスト方法
this.myView = new MyView();
spyOn(this.myView, "render");;
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
しかし、それは動作しません。バインドはMyViewのinitialize関数で行われるため、イベントgetはmytimeのレンダリング関数AT THAT TIMEにバインドされます。したがって、スパイを追加すると、レンダリング関数がラップされ、myView.renderに戻ります。しかし、最初のバインドによって作成されたクロージャーはまだ存在し、我々は完全にうんざりしています。では、どうすればいいのですか?私は、別々の機能への私のバインド・コールさん、のようなものに移動されました:
myView = Backbone.View.extend({
initialize: function(){
_.bindAll(this, "render");
this.initialize_model_bindings();
},
initialize_model_bindings: function(){
something.bind("change", this.render);
},
render: function(){ //... }
});
をし、私のテストは、その後、次のようになります。これは動作しますが、私はよりよい解決策を探しています
this.myView = new MyView();
spyOn(this.myView, "render");
this.myView.initialize_model_bindings();
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
。ありがとう
あなたはこの点について説明していますか?「最初のバインドによって作成されたクロージャはまだ存在し、私たちは完全に夢中になっていますか?私は同じ問題を抱えており、何が起こっているのか理解しようとしています。ありがとう。 –
'new MyView()'を呼び出すと、initializeメソッドが呼び出され、その時点でオブジェクトに存在するレンダリング関数がchangeイベントにバインドされます。その時点から、変更イベントにバインドされているレンダリング関数にアクセスすることは不可能です。これはクロージャーにロックされています。 – idbentley
説明をありがとう。 –