2013-11-02 2 views
2

Я работаю с предварительно созданным клиентским приложением, написанным с помощью Dojo 1.8 (стиль AMD), который мне нужно расширить.Dojo: переопределить предварительно загруженный модуль

У меня есть доступ к исходному коду, но вы можете оставить его неизменным, где это возможно, и вместо этого использовать переопределения (как работает фреймворк приложения, все остальное будет взломом).

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

Вот мой вопрос: я хотел бы расширить один из базовых классов приложений (создан с объявлением) и применить мои переопределения глобально - даже на предварительно загруженных модулях, которым уже нужен модуль, содержащий этот класс (но еще не его экземпляр).

До сих пор лучшим решением, которое я нашел, является использование require() для псевдонима модуля, содержащего класс. Но это работает только с модулями, которым требуется класс после того, как я смог зарегистрировать псевдоним.

+2

Лучший способ это просто переопределить прототип модуль, который вы хотите отредактировать. вы можете сделать это с прототипом напрямую или с dojo.extend. Также посмотрите вверх, «исправление обезьяны додзе» – tik27

ответ

3

В Dojo AMD Loader documentation состоянии:

После того, значение модуля было введено в пространстве имен модуля, это не пересчитывается каждый раз, когда она востребована. На практическом уровне это означает, что фабрика запускается только один раз, а возвращаемое значение - , кэшированное и разделяемое между всеми кодами, которые используют данный модуль. (Примечание:. Додзё погрузчик включает в себя нестандартную функции require.undef, которая undefines значения модуля)

Это означает, что если вы измените прототип модуля, изменения будут распространяться по всему приложению, даже к экземплярам, ​​созданным до изменения, потому что это работает JavaScript.

Чтобы изменить прототип класса, созданного с помощью dojo/_base/declare, есть extend() метод, определенный на конструкторе:

require(['App'], function(App) { 
    App.extend({ 
     run: function() { 
      // override `run` method here   
     } 
    }); 
}); 

в действии: http://jsfiddle.net/phusick/HxkFs/

+1

Это именно то, что я искал. Большое спасибо! –

Смежные вопросы