0

私はjQuery Classプラグインを次のように使用しています:

jQuery(document).ready(function($) {
    window.SSK.calendar = new(Class.extend({
    filter_by_filtered_names: function() {
      console.log('foobar!');
    },
      init: function() {
        if ( window.location.href.match(/name_filters/) ) {
          SSK.calendar.filter_by_filtered_names();
        };
      }
    }))
});

何らかの理由で、これはロード時に返されます:

SSK.calendar is undefined

これは、プラグイン クラスが独自の呼び出しの前にロードされていないことを示しています。本当に奇妙です。誰かが救済策を知っていたら興味がありますか?

4

2 に答える 2

2

どのように機能するかわからなくても、動作は私には完全に理にかなっているようですClass:

Class.extend(...)新しいコンストラクター関数を作成します(私は推測します)。newを呼び出すコンストラクタを実行しますinit。結果は に割り当てられwindow.SSK.calendarます。はinitインスタンス化時に呼び出され、これはインスタンスが に割り当てられる前に発生しますwindow.SSK.calendar

簡単な例を次に示します。

function MyClass() {
    this.bar = 'baz';
    console.log(foo.bar);
}

var foo = new MyClass();

コンストラクターが呼び出された時点でfooはまだなので、これは失敗します。undefinedインスタンスは関数呼び出しの戻り値であるため、呼び出しのfooにインスタンスへの参照を含めることはできません。

thisインスタンスを参照するために使用するだけで、問題を解決できる場合があります。

init: function() {
    if ( window.location.href.match(/name_filters/) ) {
    // better in this case: if(/name_filters/.test(window.location.href))
        this.filter_by_filtered_names();
    };
}

プラグインのドキュメントには、メソッド内からインスタンスを参照する方法が記載されている必要があります。

于 2012-06-20T17:11:36.177 に答える
0

2 つの onReady リスナーを使用しているようです:jQuery(document).ready(fn)$(fn)はまったく同じです。事実上、外側の関数が実行されるときに関数キューの最後に内側の関数を追加します。SSK.calendarそれ以降に登録されていないonDOMready関数でアクセスしようとすると、利用できなくなります。

例:

$(function(){
    console.log("A");
    $(function(){
       console.log("B");
    });
    console.log("C");
});
$(function(){
    console.log("D");
});

ログに記録します:

A
C
D
B
于 2012-06-20T17:09:35.627 に答える