Angular Наследование лучшей практики ui-router против метаданных - программирование
Подтвердить что ты не робот

Angular Наследование лучшей практики ui-router против метаданных

Я конвертирую свое приложение из ngRoute в uiRouter. Я читал и смотрел много учебников, но мне все еще не хватает опыта, чтобы принять решение о лучших практиках.

Прежде всего, основное изменение, которое я сделал, - разбить декларацию состояния на каждый модуль/контроллер. Это кажется мне более естественным и чистым, но представляет собой некоторую сложность, когда вы хотите применить глобальное правило ко многим государствам. Например, половина моих маршрутов требует аутентификации, а другая половина - нет. С ngRoute у меня был атрибут данных, обозначающий уровень авторизации, необходимый для каждого маршрута. С uiRouter я понимаю, что есть такой способ сделать это, и есть способ наследования штата. Таким образом, маршрут может быть public.myRoute, где public - это абстрактный маршрут, объявленный на уровне приложения. Это создает проблему, хотя модуль не может работать автономно, если кто-то не определяет публичное состояние. В отличие от этого, если я добавлю атрибут метаданных в объект данных, например "auth_level: user", это не повлияет на модуль, если с ним никто не справится. Но это кажется более "волшебным" и менее ремонтопригодным.

То же самое происходит с навигационной панелью. У половины моих просмотров есть панель навигации, а другая половина - нет. До сих пор я использовал атрибут isNavbarVisible boolean, но я понимаю, что это должно быть частью состояния? Возможно, второй ui-view в шаблоне layout.html вместо использования ng-include с ng-if, как я это делал до сих пор?

Наконец, мне интересно, как лучше всего применять обещание в каждом маршруте, который нужно решить. Например, независимо от того, где находится точка входа приложения, права пользователя должны быть разрешены перед загрузкой представления. В ngRoute я перебирал все маршруты в своем определении и добавлял это обещание.

Есть ли хорошее руководство для лучших практик при переходе с ngRoute на uiRouter, потому что предпочтительнее других рекомендаций, таких как "заменить ng-include" именем ui-view или этим государственным наследованием, я не нашел никаких конкретные реализации, демонстрирующие это.

4b9b3361

Ответ 1

Я в той же ситуации, чем автор вопроса, вот очень интересная информация о том, как управлять этим изменением. https://github.com/angular-ui/AngularJS-StyleGuide

Ответ 2

ui-router является сторонним модулем и очень мощным. Он поддерживает все, что может сделать обычный ngRoute, а также множество дополнительных функций.

Вот общая причина, по которой ui-router выбирается над ngRoute
ui-router позволяет вложенные представления и несколько именованных представлений. Это очень полезно в более крупном приложении, где у вас могут быть страницы, которые наследуются от других разделов.

ui-router позволяет вам иметь привязку сильного типа между состояниями, основанными на именах состояний. Изменение URL-адреса в одном месте будет обновлять каждую ссылку на это состояние, когда вы создадите свои ссылки с помощью ui-sref. Очень полезно для больших проектов, где URL-адреса могут меняться.

Существует также концепция decorator, которая может использоваться, чтобы позволить вашим маршрутам динамически создаваться на основе URL-адреса, который пытаясь получить доступ. Это может означать, что вам не нужно будет указывать все ваши маршруты перед началом работы.

states позволяет отображать и получать доступ к различной информации о разных состояниях, и вы можете легко передавать информацию между состояниями через $stateParams.

Вы можете легко определить, находитесь ли вы в состоянии или родительском состоянии состояния, чтобы настроить элемент пользовательского интерфейса (выделение навигации текущего состояния) внутри ваших шаблонов с помощью глобального $state, предоставляемый ui-router

В целом, ngRoute просто позволяет назначать контроллеры и шаблоны маршрутам URL, тогда как фундаментальная абстракция в ui.router составляет states, что является более мощным понятием.