如果我在这里明确定义,我的元素是如何定义的。它适用于所有其他方法,但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"
});
答案 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.entries
,Calendar.entries
引用setUpCalendar
和this.entries
而不是this.elem
和{{1}责备地。
答案 1 :(得分:0)
在init()
中,您elem
添加this
,即myCalendar
。在setupCalendar()
中,您试图从Calendar
检索它,而elem
似乎没有myCalendar
属性(除非它位于代码的不同部分),即使它是< del> {{1}}的构造函数原型。