Мне любопытно, есть ли способ переопределить отдельные конкретные шаблоны из файла ui-bootstrap-tpls. Подавляющее большинство шаблонов по умолчанию соответствуют моим потребностям, но есть пара конкретных, которые я хотел бы заменить, не проходя весь процесс захвата всех шаблонов по умолчанию и их подключения к версии без tpls.
Можете ли вы переопределить определенные шаблоны в AngularUI Bootstrap?
Ответы (4)
Да, директивы из http://angular-ui.github.io/bootstrap легко настраиваются, и их легко переопределить. один из шаблонов (и по-прежнему полагаться на шаблоны по умолчанию для других директив).
Достаточно передать $templateCache
, либо напрямую (как это делается в файле ui-bootstrap-tpls
), либо, что проще, переопределить шаблон с помощью директивы <script>
(документ).
Надуманный пример, в котором я меняю шаблон оповещения, чтобы поменять местами x
на Close
, показан ниже:
<!doctype html>
<html ng-app="plunker">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
<script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.4.0.js"></script>
<script src="example.js"></script>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
<script id="template/alert/alert.html" type="text/ng-template">
<div class='alert' ng-class='type && "alert-" + type'>
<button ng-show='closeable' type='button' class='close' ng-click='close()'>Close</button>
<div ng-transclude></div>
</div>
</script>
</head>
<body>
<div ng-controller="AlertDemoCtrl">
<alert ng-repeat="alert in alerts" type="alert.type" close="closeAlert($index)">
{{alert.msg}}
</alert>
<button class='btn' ng-click="addAlert()">Add Alert</button>
</div>
</body>
</html>
Плункер в реальном времени: http://plnkr.co/edit/gyjVMBxa3fToYTFJtnij?p=preview
Использование $provide.decorator
Использование $provide
для оформления директивы избавляет от необходимости напрямую возиться с $templateCache
.
Вместо этого создайте свой внешний HTML-шаблон, как обычно, с любым именем, которое вам нравится, а затем переопределите templateUrl
директивы, чтобы указать на него.
angular.module('plunker', ['ui.bootstrap'])
.config(['$provide', Decorate]);
function Decorate($provide) {
$provide.decorator('alertDirective', function($delegate) {
var directive = $delegate[0];
directive.templateUrl = "alertOverride.tpl.html";
return $delegate;
});
}
Форк plunkr pkozlowski.opensource: http://plnkr.co/edit/RE9AvUwEmKmAzem9mfpI?p=preview
(Обратите внимание, что вы должны добавить суффикс «Директива» к имени директивы, которую вы собираетесь декорировать. Выше мы украшаем директиву alert
UI Bootstrap, поэтому мы используем имя alertDirective
.)
Поскольку вы часто можете захотеть сделать больше, чем просто переопределить templateUrl
, это обеспечивает хорошую отправную точку для дальнейшего расширения директивы, например, путем переопределения/обертывания ссылки или функции компиляции (например).
alertDirective
это ключевое слово? если да, то какое ключевое слово для Tabs
? Я пытаюсь сделать то же самое на вкладках, но я просмотрел alert.js и не вижу, где у них там было alertDirective
.
- person codenamezero; 28.05.2015
$compileProvider
прикрепляет суффикс «Директива» к имени вашей директивы при ее регистрации (аналогично $filterProvider
с суффиксом «Фильтр»); для большинства целей это невидимо, но при украшении вам нужно будет добавить этот суффикс к директиве, на которую вы собираетесь ориентироваться. Например, tabDirective
или tabsetDirective
и т. д. Не совсем четко задокументировано нигде, что я мог найти, но вот ссылка на аналогичное поведение по крайней мере для $filterProvider
: docs.angularjs.org/api/ng/provider/$filterProvider
- person JcT; 28.05.2015
function(element, attributes)
для templateUrl. Вы можете использовать это для некоторого динамического поведения (возврат исходной функции templateUrl или вашей собственной строки URL-адреса в зависимости от атрибута и т. д.). Тем не менее, ui.bootstrap теперь также использует ту же функциональность, чтобы вы могли указать атрибут template-url
в директиве, поэтому вы также можете потенциально использовать это, если вы согласны указать путь к шаблону напрямую через атрибут элемента директивы.
- person JcT; 09.05.2016
Ответ от pkozlowski.opensource действительно полезен и мне очень помог! Я настроил его в моем состоянии, чтобы иметь один файл, определяющий все мои переопределения шаблона angular, и загрузил внешний JS, чтобы уменьшить размер полезной нагрузки.
Для этого перейдите в конец исходного js-файла angular ui-bootstrap (например, ui-bootstrap-tpls-0.6.0.js
) и найдите интересующий вас шаблон. Скопируйте весь блок, определяющий шаблон, и вставьте его в JS-файл переопределений.
e.g.
angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) {
$templateCache.put("template/alert/alert.html",
" <div class='alert' ng-class='type && \"alert-\" + type'>\n" +
" <button ng-show='closeable' type='button' class='close' ng-click='close()'>Close</button>\n" +
" <div ng-transclude></div>\n" +
" </div>");
}]);
Затем просто включите файл переопределений после ui-bootstrap, и вы получите тот же результат.
Разветвленная версия проекта pkozlowski.opensource http://plnkr.co/edit/iF5xw2YTrQ0IAalAYiAg?p=preview
Вы можете использовать template-url="/app/.../_something.template.html"
, чтобы переопределить текущий шаблон для этой директивы.
(По крайней мере, работает в Accordion Bootstrap.)
$modal
, чтобы получить больше возможностей для настройки, не создавая (надеюсь) слишком много головной боли при обслуживании.$provide.decorator('$modal'
... В моем случае я не хотел отображать элементmodalWindow
. Всегда. Я просто не использовал его, и это было лучшее, что я мог придумать. Я хотел бы услышать лучший способ, если у кого-то есть. - person bodine   schedule 03.09.2014