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

似乎您使用了两个 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 回答