Переопределение метода базового класса
Доброго времени суток.
Суть задачи: есть некий класс, нужно сделать так, чтобы вызвался его метод(приватный) и выполнились мои дополнительные действия. Конкретно: Есть jquery datepicker, у него есть метод _generateHTML, нужно сделать так, чтобы он вызывался и делал все что он делает, плюс еще дополнительные действия. А вообще задача состоит в том чтобы динамически изменять Html datepicker'a, а проблема в том, что он постоянно его перегенерирует и я не знаю, куда привязать мои действия по изменению html. (ах да, редактировать файл с кодом самого DatePicker'a нельзя) полезные ссылки: http://jquery-ui.googlecode.com/svn/....datepicker.js |
up
|
walash, вы топик только сегодня создали, не нужно апать его так быстро/часто.
Сами уже что-то попробовали сделать? А то Ваш топик звучит как задание, а не просьба помочь. Для заданий, есть соответствующий раздел. |
Так сделать-то можно, но это гадко и подло :) То есть примерно так:
$.datepicker.constructor.prototype._generateHTML = function(){
// do something ...
}
$.datepicker = new $.datepicker.constructor()
Но все же, может быть, можно без этого обойтись, решив проблему как-то иначе? |
e1f, ты почти оветил на мой вопрос!! :dance:
еще последний шаг и проблема будет решена $.datepicker.constructor.prototype._generateHTML = function(){ $.datepicker._generateHTML(inst); // не знаю как в этом месте вызвать этот метод, чтобы выполнился для текущего состояния объекта DoSomeExtraActions(); } $.datepicker = new $.datepicker.constructor(); P.S. to Dmitry A. Soshnikov: сори за напористость ) |
К тому же если так написать получается рекурсия :cray:
|
Конечно, так получается рекурсия. Надо выдрать код старого метода, поместить в новый, и переделать (ну или дописать в конце свое, родное)
|
Спасибо большое за советы
|
мб лучше так?
var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;
$.datepicker.constructor.prototype._generateHTML = function(){
oldGenerateHTML.apply(this, arguments);
...
}
|
Да, так действительно лучше :) Но тут маленькое но -- $.datepicker.constructor.prototype._generateHTML не существует
|
Не знаю, у меня прокатило и работает ;)
function ExtendFunctionality() {
$.datepicker.constructor.prototype._updateDatepicker = function(inst) {
// code from date picker
ModifyDatePicker(); // OUR CHANGES
}
}
с _generateHTML тоже пробовал и тоже работает |
персанальное спасибо x-yuri за:
var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;
$.datepicker.constructor.prototype._generateHTML = function(){
oldGenerateHTML.apply(this, arguments);
...
}
50 строк гавнокода долой ! |
Цитата:
|
Поспешил радоваться, почти все методы datepicker'a имеют ссылки this, который адресуюстя на инстанс datepicker'a, а когда мы пишем так:
var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML; то он в this разпазнает как window, а не $.datepicker А когда код вбиваешь туда текстом, то почему то все ок |
x-yuri,
Да, все верно. Я смотрел у себя какую-то не ту версию Datepickera :) |
Цитата:
|
function ExtendFunctionality() {
$.datepicker.constructor.prototype._updateDatepicker = function(inst) {
// когда здесь пишется this, тогда он воспринимается как $.datepicker
ModifyDatePicker(); // OUR CHANGES
}
}
при данном раскладе, this рассматривается как window и идет прямиком в код datepicker'a:
function ExtendFunctionality() {
var oldUpdateDatepicker = $.datepicker.constructor.prototype._updateDatepicker;
$.datepicker.constructor.prototype._updateDatepicker = function(inst) {
oldUpdateDatepicker(inst); // когда начинает выполнятся код отсюда, то this это уже window
ModifyDatePicker(); // OUR CHANGES
}
}
Вот что валяется в _updateDatepicker:
/* Generate the date picker content. */
_updateDatepicker: function(inst) {
var dims = {width: inst.dpDiv.width() + 4,
height: inst.dpDiv.height() + 4};
var self = this;
inst.dpDiv.empty().append(this._generateHTML(inst)) // первое место, где this уже не тот
.find('iframe.ui-datepicker-cover').
css({width: dims.width, height: dims.height})
.end() . . . // и т.д. и т.п.
. . . . . . . .. .. .. . . .. . .
. . . . . .. . .. . . . .. .
}
|
walash, Вам же x-yuri писал как надо:
вместо oldUpdateDatepicker(inst)используйте oldGenerateHTML.apply(this, arguments) |
Ребята, я вас люблю
|
| Часовой пояс GMT +3, время: 23:49. |