Я использую превосходный Угловой пользовательский бутстрап на большом сайте наряду с множеством моих собственных директив. Для аккуратности я искал способ переименовать пару директив uib, не касаясь их кода, и наткнулся на пару вопросов SO, и это выглядело как отличное решение. Беда в том, что он не работает для меня. Вот мой код.
angular.module('s4p').config(function($provide, $compileProvider){
console.log("I am logged in the console");
$provide.decorator('uibPaginationDirective', function($delegate){
console.log("I am not logged");
$compileProvider.directive('s4pPaging', function(){
return $delegate[0];
});
return function() { return angular.noop };
});
});
Я положил пару console.logs туда, чтобы увидеть, насколько это становится, и я вижу, что это даже не работает декоратора. Сначала я подумал, что это может быть простой ошибкой орфографии в uiPaginationDirective, но если я изменю хотя бы один символ, тогда я получаю большую ошибку инжектора в консоли. Таким образом, он определенно находит исходную директиву, но функция украшения не работает.
Я делаю что-то действительно глупое?
Редактировать: Просто чтобы прояснить, я использую нг-Аннотировать для упрощения инъекции зависимостей, следовательно, не массив зависимостей в .config()
Edit 2: Декоратор не работает если элемент не используется на странице, чего я не понял. Итак, если вы используете старый элемент, то декоратор действительно работает, но если вы используете новый псевдоним, тогда ничего не происходит вообще. Я начинаю думать, что этот код, который я нашел, возможно, никогда не работал, если оригинальная директива не используется, чтобы выгнать декоратора в механизм.
Редактировать 3: Я добавил щедрость к этому, потому что было бы неплохо найти решение. Даже если никто не может исправить код примера, должны быть другие способы переименования директивы третьей стороны, не меняя ее? Я нашел плагин под названием «alias», который делает это, но я действительно не хочу использовать дополнительный сторонний код, и я хочу понять решение.
Edit 4: Я играл с кодом, который я одолжил, чтобы сделать это, которые вы можете увидеть в следующем plunkr - http://plnkr.co/edit/3aDEed?p=preview Я думаю, что это работает только потому, что демка использует оригинальную директиву в HTML, за которым следует переименованная директива. Если вы удалите исходный текст из HTML, они оба исчезнут. Это я предполагаю, потому что директивный декоратор запускается только при первом использовании директивы. Итак, теперь мой поиск - найти способ заставить дизайнера работать без использования исходной директивы или искать лучший способ переименовать стороннюю директиву ...
Редактировать 5: Я пробовал что-то иначе, похоже, что плагин с псевдонимом, похоже, работает под капотом.
angular.module('s4p').directive('s4pPaging', function(){
return {
restrict: 'EA',
replace: true,
template: '<uib-pagination class="s4pPaging"></uib-pagination>'
}
});
... но, к сожалению, я получаю следующее сообщение об ошибке.
Error: [$compile:multidir] Multiple directives [s4pPaging (module: s4p), uibPagination] asking for template on:...
Я не понимаю, почему они оба просят шаблон. Я бы предположил, что s4p-пейджинг будет заменен на uib-pagination и все атрибуты, скопированные на элемент uib-pagination. Ясно, что я не понимаю, почему что-то простое не работает.
Что в $ делегатом [0], из любопытства? – matmo
Я не уверен. Я получил код ответа на этот вопрос - http://stackoverflow.com/questions/26416206/directive-name-and-attribute-name-clashing – jonhobbs
Вы можете просто создать экземпляр, выполнив '.run (['$ инжектор ', функция ($ инжектор) { $ injector.get (' propertyDirective '); }]); '. Я могу получить это в модульном режиме, если вы захотите. – PSL