Каков правильный / приемлемый способ использования отдельных таблиц стилей для различных представлений, которые использует мое приложение?
В настоящее время я размещаю элемент ссылки в html view / partial вверху, но мне сказали, что это плохая практика, хотя все современные браузеры поддерживают его, но я понимаю, почему это не одобряется.
Другая возможность - разместить отдельные таблицы стилей в моем index.html, head
но я бы хотел, чтобы таблица стилей загружалась только в том случае, если ее представление загружается во имя производительности.
Является ли это плохой практикой, поскольку стили не вступят в силу до тех пор, пока css не будет загружен с сервера, что приведет к быстрой вспышке неформатированного содержимого в медленном браузере? Я еще не был свидетелем этого, хотя тестирую это локально.
Есть ли способ загрузить CSS через объект, переданный в Angular $routeProvider.when
?
Заранее спасибо!
источник
<link>
теги css в этом формате с последней версией Chrome, сервером на моем локальном компьютере (и «Отключить кеш» для имитации условий «первой загрузки»). Я полагаю, что предварительная вставка<style>
тега в партиал html на сервере позволит избежать этой проблемы.Ответы:
Я знаю, что этот вопрос устарел, но, проведя массу исследований различных решений этой проблемы, я думаю, что, возможно, придумал лучшее решение.
На случай, если кому-то в будущем интересно, вот что я придумал:
1. Создайте настраиваемую директиву для
<head>
элемента:Эта директива выполняет следующие действия:
$compile
) строку html, которая создает набор<link />
тегов для каждого элемента вscope.routeStyles
объекте, используяng-repeat
иng-href
.<link />
элементов к<head>
тегу.$rootScope
для прослушивания'$routeChangeStart'
событий. Для каждого'$routeChangeStart'
события он захватывает «текущий»$$route
объект (маршрут, который пользователь собирается покинуть) и удаляет свои частичные файлы css из<head>
тега. Он также захватывает «следующий»$$route
объект (маршрут, по которому собирается перейти пользователь) и добавляет к<head>
тегу любой из своих частичных файлов css .ng-repeat
часть скомпилированного<link />
тега обрабатывает все операции добавления и удаления таблиц стилей для конкретной страницы в зависимости от того, что добавляется или удаляется изscope.routeStyles
объекта.Примечание: для этого требуется, чтобы ваш
ng-app
атрибут находился на<html>
элементе, а не на<body>
чем-либо внутри<html>
.2. Укажите, какие таблицы стилей каким маршрутам принадлежат, используя
$routeProvider
:Эта конфигурация добавляет настраиваемое
css
свойство к объекту, которое используется для настройки маршрута каждой страницы. Этот объект передается каждому'$routeChangeStart'
событию как.$$route
. Таким образом, при прослушивании'$routeChangeStart'
события мы можем получить указанноеcss
свойство и добавлять / удалять эти<link />
теги по мере необходимости. Обратите внимание, что указаниеcss
свойства в маршруте не является обязательным, так как оно было опущено в'/some/route/2'
примере. Если у маршрута нетcss
свойства,<head>
директива просто ничего не сделает для этого маршрута. Также обратите внимание, что вы можете даже иметь несколько таблиц стилей для каждой страницы, как в'/some/route/3'
приведенном выше примере, гдеcss
свойство представляет собой массив относительных путей к таблицам стилей, необходимых для этого маршрута.3. Все готово. Эти две вещи настраивают все, что было необходимо, и, на мой взгляд, делает это с максимально чистым кодом.
Надеюсь, что это поможет кому-то еще, кто, возможно, борется с этой проблемой так же сильно, как и я.
источник
index.html
файла. Таким образом, в приведенном выше примереindex.html
это будет в корне, аcss
папка будет в корне, содержащая все файлы css. но вы можете структурировать свое приложение по своему усмотрению, если используете правильные относительные пути.angular.forEach(current.$$route.css, function(sheet){ delete scope.routeStyles[sheet]; });
.Решение @ tennisgent отличное. Однако я думаю, что это немного ограничено.
Модульность и инкапсуляция в Angular выходят за рамки маршрутов. В зависимости от того, как Интернет движется к разработке на основе компонентов, важно также применять это в директивах.
Как вы уже знаете, в Angular мы можем включать шаблоны (структуру) и контроллеры (поведение) в страницы и компоненты. AngularCSS позволяет последний недостающий элемент: прикрепление таблиц стилей (презентация).
Для полного решения я предлагаю использовать AngularCSS.
ng-app
в<html>
теге. Это важно, если на одной странице запущено несколько приложений.https://github.com/door3/angular-css
Вот некоторые примеры:
Маршруты
Директивы
Дополнительно вы можете использовать
$css
сервис для крайних случаев:Вы можете узнать больше об AngularCSS здесь:
http://door3.com/insights/introducing-angularcss-css-demand-angularjs
источник
Можно добавить новую таблицу стилей в заголовок
$routeProvider
. Для простоты я использую строку, но также могу создать новый элемент ссылки или создать службу для таблиц стилей.Самым большим преимуществом предварительного кодирования на странице является то, что любые фоновые изображения уже существуют, и меньшая вероятность
FOUC
источник
<link>
в<head>
в index.html статически, хотя?when
для маршрута не был вызван. Можно поместить этот код вcontroller
обратный вызовwhen
внутриrouteProvider
или, возможно, вresolve
routeprovider
... этот комментарий@ sz3, сегодня довольно забавно, мне пришлось сделать именно то, что вы пытались достичь: « загружать определенный файл CSS только тогда, когда пользователь обращается » к определенной странице. Итак, я использовал решение выше.
Но я здесь, чтобы ответить на ваш последний вопрос: « где именно я должен поместить код. Есть идеи ?
Вы были правы, включив код в решение , но вам нужно немного изменить формат.
Посмотрите на код ниже:
Я только что протестировал, и он работает нормально , он вводит html и загружает мой «home.css» только тогда, когда я нажимаю маршрут «/ home».
Полное объяснение можно найти здесь , но в основном решение: должен получить объект в формате
Вы можете назвать « ключ » как угодно - в моем случае я назвал « стиль ».
Тогда для значения у вас есть два варианта:
Если это строка , то это псевдоним службы.
Если это функция , то она вводится, а возвращаемое значение рассматривается как зависимость.
Главное здесь то, что код внутри функции будет выполнен до того, как будет создан экземпляр контроллера и сработает событие $ routeChangeSuccess.
Надеюсь, это поможет.
источник
Круто, спасибо !! Просто нужно было внести несколько корректировок, чтобы он работал с ui-router:
источник
Если вам нужно применить CSS только к одному конкретному представлению, я использую этот удобный фрагмент внутри своего контроллера:
Это добавит класс к моему
body
тегу при загрузке состояния и удалит его, когда состояние будет уничтожено (т.е. кто-то изменит страницы). Это решает мою связанную проблему, заключающуюся в необходимости применения CSS только к одному состоянию в моем приложении.источник
«использовать строгое»; angular.module ('app') .run (['$ rootScope', '$ state', '$ stateParams', function ($ rootScope, $ state, $ stateParams) {$ rootScope. $ state = $ state; $ rootScope . $ stateParams = $ stateParams;}]) .config (['$ stateProvider', '$ urlRouterProvider', function ($ stateProvider, $ urlRouterProvider) {
источник