我是js的新手,我想覆盖/覆盖另一个脚本(my-fullcalendar.js(中的一些fullcalendar函数,以便为自己进行一些更改。 例如,函数名称是:
格式范围和旧时刻格式。
formatRange 可以从这个.$.fullCalendar.formatRange 访问,但 oldMomentFormat 不能通过这种链访问。但即使我在 full-calendar 中做这样的事情.js:
;(function () {
function MyformatRange(date1, date2, formatStr, separator, isRTL) {
console.log( "MyformatRange");
//other parts is exactly the same
// ...
}
this.$.fullCalendar.formatRange=MyformatRange;
console.log(this);
})();
没有任何反应,因为没有生成日志,甚至逐行跟踪也不会从这里传递。 但是当在控制台日志中观察到"this"时,MyformatRange 被原始 formatRange 替换。另一个问题是我如何覆盖/覆盖不在窗口层次结构中的oldMomentFormat函数来访问(或者我找不到它(?
好的,让我们简化问题。本质上,您有这种情况:
var makeFunObject = function () {
var doSomething = function (msg) {
console.log(msg);
};
var haveFun = function () {
doSomething( "fun!");
};
return {
doSomething : doSomething,
haveFun : haveFun
};
};
换句话说,你有一个创建闭包的函数。闭包内部有两个"私有"函数,其中一个调用另一个。但是这两个函数似乎都在返回的对象中"公开"。
你写一些代码:
var myFunObject = makeFunObject();
myFunObject.haveFun(); // fun!
是的,似乎工作得很好。现在让我们替换返回对象中的 doSomething
函数并再次调用 haveFun
:
myFunObject.doSomething = function (msg) {
console.log("My new function: " + msg);
};
myFunObject.haveFun(); // fun! <== wait what?
但是等等!未调用新的替换函数!没错:haveFun
函数被明确编写为调用内部函数。事实上,它对对象中公开的函数一无所知。
这是因为你不能以这种方式替换内部的私有函数(事实上,你不能在不改变原始代码的情况下替换它(。
现在回到 FullCalendar 代码:您正在替换对象中的外部函数,但内部函数是由 FullCalendar 中的所有其他函数调用的函数。
我意识到这是一个老问题,但是当我想覆盖getEventTimeText
函数时,我遇到了同样的问题。
我能够从我自己的 JS 文件中完成此操作,如下所示:
$.fullCalendar.Grid.mixin({
getEventTimeText: function (range, formatStr, displayEnd) {
//custom version of this function
}
});
因此,就您尝试覆盖的功能而言,您应该能够通过以下方式执行此操作:
$.fullCalendar.View.mixin({
formatRange: function (range, formatStr, separator) {
//custom formatRange function
}
});
注意:请确保在您实际创建日历的位置之前运行此操作。另请注意,您需要确保在正确的位置覆盖函数。例如,getEventTimeText
在$.fullCalendar.Grid
,而formatRange
在$.fullCalendar.View
。
希望这对最终解决这个问题的其他人有所帮助。