2011-05-17 4 views
0

私はbackbone.jsを使ってjs重いアプリケーションを構築しています。私は数回実行した1つの問題は、深い入れ子から外側のオブジェクトを呼び出す方法です機能。次のコード例では、私はこれを行うための最善の方法は何ですか。スライドイベントが発生したときにcustom_functionイベントを呼びたいのでしょうか?入れ子関数から外側のオブジェクトにアクセスする(backbone.jsを使用)

App.Views.Category = Backbone.View.extend({ 
    ...., 
    render: function() { 

     $('#slider').slider({ 
      min:0, 
      max:100, 
      slide: function(event, ui) { 
       //HOW DO I CALL THE custom_function from here???? 

      }, 

     }); 
    }, 

    custom_function: function() { 
     alert('in custom function'); 
    }, 


}); 

答えて

2

空自2つの一般的なオプションがあります。

thisのいずれかのオブジェクトにthatまたはselfを呼び出します。

render: function() { 
    var that = this; 
    $('#slider').slider({ 
     min:0, 
     max:100, 
     slide: function(event, ui) { 
      //HOW DO I CALL THE custom_function from here???? 
      that.custom_function(); 
     }, 

    }); 
}, 

また、関数のコンテキストをバインドすることもできます。

render: function() { 
    $('#slider').slider({ 
     min:0, 
     max:100, 
     slide: (function(event, ui) { 
      //HOW DO I CALL THE custom_function from here???? 
      this.custom_function(); 
     }).bind(this), 

    }); 
}, 

Function.prototype.bindはES5はだけなので、クロスブラウザのサポート

+0

ため_.bindまたは$.proxyを使用私はあなたが前に持っていた最初のアプローチを試してみましたです。 "this"は常に "#slider" dom要素を与え、 "that"は空になります。 2番目のアプローチでは、jqueryから "handlers.push in fucntion"というエラーが出ます。 – DevX

+0

@DevX '.bind'はchrome/FF3.6 +/IE9でしか動作しませんので、それらで試してみてください。あなたの描写が本当に奇妙なバグのように聞こえる。 – Raynos

+0

とにかくクロスブラウザのサポートにはおそらく_.bindを使用します。この場合、_.bindの構文はどうなりますか? – DevX

関連する問題