Comments 7
Что мешает делать наследование директив подобным образом?
Но название Angular Light очень понравилось, я уж подумал google новую версию angular выпустил, пока я спал. :)
var dir = { // объект директивы };
app.directive("MyDir1", function(){
return dir;
});
app.directive("MyDir2", function(){
var dir2 = angular.copy(dir);
dir2.template="..."; //переопределение чего либо
return dir2;
});
Но название Angular Light очень понравилось, я уж подумал google новую версию angular выпустил, пока я спал. :)
0
Можно, но не очень удобно: как отнаследовать MyDir2, что если MyDir1 изменится, как на счет стандартных директив? Можно сделать более удобные обертки, но все таки неплохо было бы иметь поддержку на уровне фреймворка.
0
как отнаследовать MyDir2, что если MyDir1 изменится
Ну здесь все просто, нужно вынести
var dir2 = angular.copy(dir);
за определение директивы, и повторить наследование.как на счет стандартных директив
Стандартные директивы хорошо спроектированы, и не думаю что у кого-то возникнет необходимость в их переопределении. Но если все же возникнет, есть исходники.
0
Можно глобально директиву и не хранить, ее можно достать через `$injector`
Кстати, стандартные тоже доступны, можно переопределять методы и в них
app.directive("MyDir1", function(){
return dir;
});
app.directive("MyDir2", function(MyDir1Directive){
var dir2 = angular.copy(MyDir1Directive);
//...
return dir2;
});
Кстати, стандартные тоже доступны, можно переопределять методы и в них
0
Кстати, стандартные тоже доступны, можно переопределять методы и в них
Можете привести пример?
0
Начну с того, что стандартные директивы и так хорошие, переопределять их не вижу смысла. Но в прошлых версиях Angular был баг в директиве
Еще так можно делать свои шаблоны для директив из библиотеки ui-bootstrap без сборки специальной версии со своими шаблонами:
Но это, как видите, необычные случаи, в обычной ситуации так делать не приходится. Если вам нужно переиспользовать логику стандартной директивы, добавьте ее в поле
Но и это делается непонятно зачем, стандартная реализация ngModel имеет достаточно оптимизаций, чтобы не вызываться слишком часто, а если вы все-таки нашли такой случай, то наверно стоит завести им issue, теперь они обновляются каждую неделю и увидеть ее исправление получится достаточно скоро
<a></a>
и для его исправления пришлось ее пропатчить:myApp.run(function(aDirective) {
"use strict";
aDirective[0].compile = function(element, attr) {
// turn <a href ng-click="..">link</a> into a link in IE
// but only if it doesn't have name attribute, in which case it's an anchor
if (!attr.href) {
attr.$set('href', '');
}
return function(scope, element) {
element.bind('click', function(event){
// if we have no href url, then don't navigate anywhere.
if (!element.attr('href')) {
event.stopPropagation(); // <- не хватало этой строчки
event.preventDefault();
}
});
};
};
});
Еще так можно делать свои шаблоны для директив из библиотеки ui-bootstrap без сборки специальной версии со своими шаблонами:
myApp.directive('myDatepicker', function(datepickerDirective) {
"use strict";
return angular.extend({}, datepickerDirective, {
templateUrl: 'partitials/datepicker.html' // custom datepicker template
});
});
Но это, как видите, необычные случаи, в обычной ситуации так делать не приходится. Если вам нужно переиспользовать логику стандартной директивы, добавьте ее в поле
requires
, тогда вы получите доступ к ней через linkFunction
. Чтобы реализовать input с задержкой как в вашем примере, нужно написать такую директиву:myApp.directive('inputDefer', function($timeout) {
return {
requires: 'ngModel',
link: function(scope, elm, attrs, ngModelCtrl) {
var $setViewValue = ngModelCtrl.$setViewValue,
delay = attrs.inputDefer;
ngModelCtrl.$setViewValue = function() {
var args = arguments;
$timeout(function() {
ngModelCtrl.$setViewValue.apply(ngModelCtrl, args);
}, 500);
};
}
};
});
Но и это делается непонятно зачем, стандартная реализация ngModel имеет достаточно оптимизаций, чтобы не вызываться слишком часто, а если вы все-таки нашли такой случай, то наверно стоит завести им issue, теперь они обновляются каждую неделю и увидеть ее исправление получится достаточно скоро
+2
Патчить директивы можно ещё следующим образом:
app.config(function($provide){
$provide.decorator('someDirective', function($delegate) {
$delegate.restrict = 'E';
$delegate.controller.method1 = function(){};
$delegate.link = function(){};
return $delegate;
}
})
0
Sign up to leave a comment.
Наследование директив в Angular Light и другие «плюшки»