Метод рефакторинга, который ранее вводили с помощью - PullRequest
1 голос
/ 08 июля 2010

Привет, я пытаюсь переопределить или расширить методы Element.show () и .hide () в mootools для добавления переключения WAI-Aria.Я пытался использовать метод Class.Refactor () следующим образом:

 Element = Class.refactor(Element, {

 show: function(displayString) {
   result = this.previous(displayString);
   // Do my thing
   return result;
 },

 hide: function() {
   result = this.previous();
   // Do my thing
   return result;
 }

});

однако, это не работает, предыдущий является нулевым, и я думаю, что причина в том, что Mootools внедряет эти методы через Element.implement.Таким образом, методы не являются родными?

Я выяснил, как полностью заменить .show и .hide, но я хотел бы сохранить все их существующие функциональные возможности и просто добавить к ним.Есть идеи?

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Я получил ответ от коллеги.Он не в SO, поэтому я пишу от его имени и куплю ему пиво в следующий раз, когда мы будем в том же городе:

Class.refactor не работает с Natives (Element, Array, String,и т. д.) потому что они не являются классами и не могут быть переопределены;MooTools просто добавляет несколько классных прототипов, чтобы сделать их более классными, веселыми и с ними легко работать.

Способ расширить нативы - использовать метод Implement ();Единственная проблема заключается в том, что this.parent () и this.previous () не существуют, поэтому вам нужно немного усложнить расширение существующих методов, не переписывая их:


(function(){ // Keeps the window namespace clean

   var old_hide = Element.prototype.hide;
   var old_show = Element.prototype.show;

   Element.implement({
       hide: function() {
           result = old_hide.run(arguments, this); // Calls old method
           alert("Hiding " + this.get('tag') );
           return result;
       },
       show: function(display) {
           result = old_show.run(arguments, this); // Calls old method
           alert("Showing " + this.get('tag') );
           return result;
       }
   });

})(); // Closes the private function and executes it immediately

Ключевые понятия здесь:

1 - Инкапсулировать весь shebang в частную самовыполняющуюся функцию, чтобы глобальное пространство имен не загрязнялось нашими переменными назначениями для оригинальных методов (например, old_hide и old_show);

2 - используйте метод Implement () для собственного объекта, чтобы переопределить каждую функцию, так же, как вы делали это в качестве второго аргумента Class.refactor;

3 - вместо вызова this.parent() или this.previous () в каждом методе вы вызываете старые прототипы с помощью метода run () MooTools, который передает аргументы с привязкой к функции и выполняет ее.

Как и прежде, убедитесь, чтособрать результат вызова функции.run () и вернуть его для обеспечения согласованности API.

1 голос
/ 08 июля 2010

Сам я не специалист по рефакторингу, но вы всегда можете сделать это «старой школы» и сохранить предыдущую функцию в переменной (например, _prev_show и _prev_hide), затем выполнить переопределение и вызвать эти функции из вашего новогоMethods.

Второй вариант - попытаться расширить Element в себя и вызвать this.parent(), это «небезопасная» версия Class.Refactor. [ссылка]

0 голосов
/ 22 декабря 2010

Насчет последнего комментария от ryber, я запутался, потому что я составил пример jsFiddle с рефакторингом класса Element ( Sample ).Хитрость в том, что, когда я пытался использовать этот пример в реальном приложении, он не работал, и я оказался здесь в поиске причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...