2010-12-10 7 views
0

私はプロトタイプ1.7を使用して、本質的にdivのリストを取得し、タブインタフェースを構築するクラスを構築しています。コールバックのクラスメソッドにアクセスする正しい方法[プロトタイプ]

var tabs = Class.create({ 
    initialize: function(container, options) { 
     this.options = Object.extend({ 
      // additional options 
      tabsRendered: null, 
     }, options || {}); 

     // init code 

     if(this.options.tabsRendered) { 
      this.options.tabsRendered(); 
     } 
    }, 

    // additional methods 

    setCurrent: function(link){ 
     //adds a .current class to tab clicked and its corresponding section 
    } 
}; 

new vtabs('products', { 
    tabsRendered: function(){ 
     if(window.location.hash != "") { 
      var link = $$('a[href$="' + window.location.hash + '"]'); 
      this.setCurrent(link); 
     } 
    } 
}); 

私の質問は、私のtabsRenderedカスタムコールバックに関するものです。コールバックが実行されるとき、this.setCurrent(link)は何もしません。

このをコールバックに渡すと、私のカスタムコールバックは期待通りに機能します。

if(this.options.tabsRendered) { 
    this.options.tabsRendered(this); 
} 

私の推測では、コールバックにこのを渡すことはベストプラクティスではないということです。では、コールバック内からメソッドへのアクセスを許可するにはどうすればよいですか?

おかげ

答えて

2

問題はtabsRendered結合していないであるということです。プロトタイプでは、bind()を使用して匿名関数をバインドする必要があります。 // init codeを実行した後:

if (Object.isFunction(this.options.tabsRendered)) 
    this.options.tabsRendered = this.options.tabsRendered.bind(this); 

をその後、あなたはthis.options.tabsRendered()を呼び出すことができますし、その回の匿名関数内で、thisは、右のオブジェクトを参照します。バインディングの詳細については、the Prototype API docsを参照してください。

EDIT:コメント:匿名の機能だけが影響を受けるのではないことは間違いありません。これはの機能が定義されている範囲のthisです。

+0

+1、関数が匿名であるかどうかは関係ありませんが、バインディングとは何の関係もありません。また、 'bind'はそれを行ういくつかの方法のうちの1つに過ぎません(ただし、それは良い方法です)。 'this'とあなたがそれを保存することを保証するための詳細については、http://blog.niftysnippets.org/2008/04/you-must-remember-this.htmlとhttp://blog.niftysnippets.org/2008/03/ mythical-methods.html –

+0

はい。私はリフェーズします。 –

+0

ありがとうgoreSplatter、あなたの提案は多くの助けになりました。興味深いことに、 "Prototype.isFunction(this.option.tabsRendered)"が機能しませんでした。実際には、スクリプトの実行が停止しました。 – jbarreiros

関連する問題