2

如果我在这里明确定义它,我的元素如何未定义。它适用于所有其他方法,但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"
});
4

2 回答 2

3

所以这里的问题是你混合了你的this参考和Calendar参考。当您调用时,this.getFeed()您正在对新创建的Calendar对象进行操作。getFeed但是,在其中,您正在设置var self = Calendar并随后使用self来设置entries和调用的值parseEntries

您在这里所做的是创建self对全局Calendar对象文字的引用(使用 )。该对象不是您通过初始化的对象Object.create(也不是您调用init的对象)。

这一切归结为,您已经初始化myCalendar并设置了elem它所附加的对象,但在随后的方法调用中,您设置entries了全局Calendar对象文字。在您的parseEntries方法内部,所有这些都变得显而易见,因为当前范围在全局Calendar对象字面量的范围内,而不是CalendarObject.create.

要修复它,请var self = this;代替var self = Calendar;. 在parseEntries参考内this.entries代替Calendar.entries,在setUpCalendar参考内this.entriesthis.elem代替Calendar.entriesCalendar.elem分别。

于 2013-07-12T19:29:45.403 回答
0

init()您添加elemthis时,即myCalendar。在setupCalendar()你试图从中检索它Calendar似乎没有elem属性(除非它在代码的不同部分),即使它是构造函数的原型myCalendar

于 2013-07-12T19:02:19.207 回答