Jestem ciekawy, czy istnieje sposób na zastąpienie pojedynczych, określonych szablonów z pliku ui-bootstrap-tpls. Zdecydowana większość domyślnych szablonów odpowiada moim potrzebom, ale jest kilka konkretnych, które chciałbym wymienić bez przechodzenia przez cały proces pobierania wszystkich domyślnych szablonów i podłączania ich do wersji innej niż tpls.
angularjs
angular-ui
angular-ui-bootstrap
Jeremy Privett
źródło
źródło
$modal
usługę, aby uzyskać większą konfigurowalność bez (miejmy nadzieję) wywoływania zbyt dużego bólu głowy związanego z konserwacją.$provide.decorator('$modal'
... W moim przypadku nie chciałem renderowaćmodalWindow
elementu. Zawsze. Po prostu go nie używałem i to było najlepsze, na co mogłem wymyślić. Chciałbym lepiej usłyszeć, gdyby ktoś to miał.Odpowiedzi:
Tak, dyrektywy z http://angular-ui.github.io/bootstrap są wysoce konfigurowalne i łatwo jest zastąpić jeden z szablonów (i nadal polegać na domyślnych w przypadku innych dyrektyw).
Wystarczy karmić
$templateCache
, albo bezpośrednio (jak to zrobiono wui-bootstrap-tpls
pliku), albo - prawdopodobnie prostsze - nadpisać szablon za pomocą<script>
dyrektywy ( doc ).Zmyślony przykład gdzie mam zmianę szablonu ALERT do zamiany
x
zaClose
przedstawiono poniżej:<!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>
Plunker na żywo: http://plnkr.co/edit/gyjVMBxa3fToYTFJtnij?p=preview
źródło
Za pomocą
$provide.decorator
Użycie
$provide
dyrektywy do dekoracji pozwala uniknąć bezpośredniego bałaganu$templateCache
.Zamiast tego utwórz swój zewnętrzny szablon html, jak zwykle, z dowolną nazwą, a następnie nadpisz dyrektywy,
templateUrl
aby na to wskazać.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; }); }
Widelec plunkr pkozlowski.opensource: http://plnkr.co/edit/RE9AvUwEmKmAzem9mfpI?p=preview
(Zauważ, że musisz dodać przyrostek „Dyrektywa” do nazwy dyrektywy, którą chcesz ozdobić. Powyżej dekorujemy
alert
dyrektywę UI Bootstrap , więc używamy nazwyalertDirective
).Ponieważ często możesz chcieć zrobić coś więcej niż tylko nadpisać
templateUrl
, jest to dobry punkt wyjścia do dalszego rozszerzania dyrektywy, na przykład przez przesłonięcie / zawinięcie linku lub funkcji kompilującej ( na przykład ).źródło
alertDirective
to słowo kluczowe? jeśli tak, do czego służy słowo kluczoweTabs
? Próbuję zrobić coś podobnego na kartach, ale przejrzałem alert.js i nie widzę, gdzie sięalertDirective
tam znajdują.$compileProvider
dołącza sufiks „Dyrektywa” do nazwy Twojej dyrektywy podczas jej rejestracji ($filterProvider
podobnie robi się z przyrostkiem „Filtr”); w większości celów jest to niewidoczne, ale podczas dekorowania musisz dodać ten przyrostek do dyrektywy, na którą zamierzasz celować. Na przykład,tabDirective
lubtabsetDirective
, itd. Nie jest dokładnie udokumentowane w żadnym miejscu, które mogłem znaleźć, ale tutaj jest odniesienie do podobnego zachowania$filterProvider
przynajmniej dla: docs.angularjs.org/api/ng/provider/$filterProviderfunction(element, attributes)
do templateUrl. Możesz tego użyć do jakiegoś dynamicznego zachowania (zwróć oryginalną funkcję templateUrl lub własny ciąg adresu URL w zależności od atrybutu itp.). Jednak ui.bootstrap używa teraz również tej samej funkcjonalności, aby umożliwić Ci dostarczenietemplate-url
atrybutu w dyrektywie, więc możesz go również potencjalnie użyć, jeśli z przyjemnością podasz ścieżkę szablonu bezpośrednio przez atrybut elementu dyrektywy.Odpowiedź z pkozlowski.opensource jest bardzo przydatna i bardzo mi pomogła! Poprawiłem go w moim stanie, aby mieć jeden plik definiujący wszystkie moje nadpisania szablonu kątowego i załadowałem zewnętrzny JS, aby zmniejszyć rozmiar ładunku.
Aby to zrobić, przejdź na dół pliku js z angular ui-bootstrap
ui-bootstrap-tpls-0.6.0.js
i znajdź szablon, który Cię interesuje. Skopiuj cały blok, który definiuje szablon i wklej go do pliku JS nadpisań.na przykład
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>"); }]);
Następnie po prostu dołącz plik przesłonięć po ui-bootstrap i osiągniesz ten sam wynik.
Rozwidlony wersja pkozlowski.opensource „s upadać http://plnkr.co/edit/iF5xw2YTrQ0IAalAYiAg?p=preview
źródło
Możesz użyć,
template-url="/app/.../_something.template.html"
aby zastąpić bieżący szablon tej dyrektywy.(Działa przynajmniej w Accordion Bootstrap.)
źródło