OOP jQuery插件元素未定义在一个地方而不是在其他地方

时间:2013-07-12 18:56:28

标签: javascript jquery oop jquery-plugins

如果我在这里明确定义,我的元素是如何定义的。它适用于所有其他方法,但setUpCalendar()除外。我已经包含了代码在到达有问题的部分之前经历的“路径”。

var Calendar = {

    init: function(options, elem) {

        this.options = $.extend( {}, this.options, options );
        this.elem = $(elem); //Clearly defined here and works elsewhere
        this.getFeed();

        return this;
    },

    getFeed: function() {
        var self = Calendar;
        $.jGFeed(this.options.feedUrl, function (feeds) {

            if (!feeds) {
                return false;
            }

            $.extend(self.entries, feeds.entries);

            self.parseEntries();
        }, 10);
    },

    parseEntries: function() {
        //Rename to fit plugin requirements
        for (var i = 0; i < Calendar.entries.length; i++) {
            var entry = Calendar.entries[i];
                entry["allDay"] = false;

            //Rename
            entry["url"] = entry["link"];
            delete entry["link"];
        };

        this.setUpCalendar();
    },

    setUpCalendar: function() {
        Calendar.elem.fullCalendar({ //It's telling me Calendar.elem is undefined here
            editable: false,
            weekends: false,
            events: Calendar.entries //funny story, here the reference works
        });
    }
};

更新

$.fn.ksdCalendar = function( options ) {
    if (this.length) {
        return this.each(function() {
            var myCalendar = Object.create(Calendar);
            myCalendar.init(options, this);
            $.data(this, 'ksdCalendar', myCalendar);
        });
    }
};

$("#calendar").ksdCalendar({
    feedUrl: "http://www.kent.k12.wa.us/site/RSS.aspx?DomainID=275&ModuleInstanceID=4937&PageID=4334"
});

2 个答案:

答案 0 :(得分:3)

因此,问题在于您混合了this引用和Calendar引用。当您致电this.getFeed()时,您正在对新创建的Calendar对象进行操作。但是,在getFeed范围内,您设置var self = Calendar,然后使用self设置entries的值并调用parseEntries

您在此处所做的是为全局self对象文字创建引用(带Calendar)。该对象不是您通过Object.create初始化的对象(并且它不是您调用init的对象)。

这一切归结为,您已初始化myCalendar并设置了附加到的elem,但在随后的方法调用中,您在全局设置了entries Calendar对象文字。在parseEntries方法中,所有这一切都变得明显,因为当前范围在全局Calendar对象文字的范围内,而不是由{{1创建和返回的Calendar对象的实例}}

要解决此问题,请执行Object.create而不是var self = this;。在var self = Calendar;引用parseEntries而不是this.entriesCalendar.entries引用setUpCalendarthis.entries而不是this.elem和{{1}责备地。

答案 1 :(得分:0)

init()中,您elem添加this,即myCalendar。在setupCalendar()中,您试图从Calendar检索它,而elem似乎没有myCalendar属性(除非它位于代码的不同部分),即使它是< del> {{1}}的构造函数原型。