2013-07-10 3 views
0

Мне нужно переопределить собственный конструктор одного из классов Extjs. Если быть точнее Ext.ensible.cal.DragZone, это из расширяемого календаря.Extjs3.4 Как переопределить конструктор

То, что я пытался, и какие решения я нашел

  1. Put нужный код в исходный код, но я хочу, чтобы избежать оригинальные модификации кода. Все мои изменения Я хочу сохранить в одном месте

  2. Ext.override - это не работает. родной конструктор называется anyway

  3. Полностью дублируйте код из оригинальной библиотеки, но с моими изменениями. Ext.ensible.cal.DragZone = Ext.extend (Ext.dd.DragZone, {..... }); Но это вызывает некоторые другие непредвиденные ошибки, кажется, что не все функции вызываются (некоторые из полей класса, кажется, не были правильно инициализированы). Но если я просто поставил этот код, а не оригинал, все работает отлично (но см. № 1)

  4. Создайте свой собственный Ext.ensible.cal.DragZone, расширив оригинал. Проблема этого метода заключается в том, что мне нужно просмотреть весь код библиотеки, переопределить и/или расширить все остальные классы, которые используют этот DragZone, чтобы заставить их использовать мои.

Так вы можете посоветовать мне что-л. Самое правильное решение для меня, кажется, просто переопределяет конструктор.

Как переопределение:

Ext.override(Ext.ensible.cal.DragZone, { 
    constructor : function() { 
     ... 
    } 
}); 

Но, как я сказал, оригинальный конструктор называется

+0

Переделки для меня в прошлом работали для конструктора. Пожалуйста, напишите код, который не работает. Сказав это, вы должны только переопределить это ошибка, и вы ожидаете, что они ее исправит. Создание собственного подкласса - это способ сделать ваш код более эффективным для наименьшего количества кода, тогда будет затронут только код, который вы выбрали для использования вашего подкласса, это немного работает, но у вас меньше шансов иметь проблемы –

+0

@JuanMendes обновил вопрос –

ответ

1

Вот хак, вы можете попробовать, помните, что имя класса является конструктор, не существует на самом деле не свойство конструктора на классе, который генерируется

Ext.ensible.cal.DragZone = function() { 
    // This is not very nice, it'd be better if you didn't have to 
    // assume what the parent is, but since we're already hacking it... 
    Ext.dd.DragZone.apply(this, arguments) ; 
    // Your code here 
} 

Обратите внимание, что это не безопасный подход, как я уже говорил в мой комментарий, но должен работать

Я предлагаю вам использовать подход 4, чтобы ваши изменения распространялись только на классы, которые предпочитают использовать его.

+0

Спасибо. Но этот подход сначала выполнит исходный код, конструктор, если я не ошибаюсь. И мне это не нужно. Мне нужно заменить какой-то оригинальный код на свой собственный. –

+0

Прост достаточно. Не вызывайте оригинал oldCtor.apply()? Я помещаю его туда, потому что не вызов супер-метода обычно является запахом кода. И это означает, что ваше исправление, скорее всего, сломается, когда они изменят свой код. Еще одна причина, почему ваш собственный подкласс - лучшая идея. –

+0

Ошибка. Мне нужно вызвать конструктор суперкласса - Ext.ensible.cal.DragZone.superclass.constructor.apply (это, аргументы); Но в этом подходе суперкласс не определен –