AngularJS: передать параметр между контроллерами

0

То, что я пытаюсь сделать:

У меня есть ListView (или, скорее, аккордеон), который содержит несколько элементов (для простоты можно предположить, что у них есть уникальный id и name). Для каждого элемента я хочу включить ссылку на aa detail-view для отображения и редактирования свойств (кроме id) этого элемента.

Googling для этого возвращает несколько результатов, например, например: Передача данных между контроллерами в Angular JS?

и из того, что я понимаю, предлагаемые решения включают:

ng-init: (см. Можете ли вы передать параметры контроллеру AngularJS при создании?)

Я мог бы инициализировать параметр для каждого элемента в моем списке, используя ng-init внутри ng-repeat. Однако к настоящему времени угловая документация советует против этого:

Единственное соответствующее использование ngInit для сглаживания специальных свойств ngRepeat, как видно из демонстрации ниже. Помимо этого случая, вы должны использовать контроллеры, а не ngInit, чтобы инициализировать значения в области.

обслуживание:

Предлагается использовать службы для обмена глобальными переменными между контроллерами. Я уже делаю это, используя службу для хранения списка элементов и использования вызовов для добавления/удаления или изменения элементов. Я также внедрил метод getItem(id) который хотел бы вызвать из контроллера моего детального просмотра. Но для этого мне нужно сначала знать идентификатор элемента!

передача значений через $routeParams

Угловая программа Phonecat Tutorial решает аналогичную проблему, передавая параметры через $routeParams. Хотя это будет работать, это означает, что я должен включить id моего элемента в ссылку на подробный просмотр. Пользователь может легко изменить ссылку и получить подробный вид для совершенно другого элемента. Если возможно, я предпочел бы не раскрывать внутренний id в ссылке на мой детальный просмотр!


Это кажется довольно распространенным требованием. Есть ли какая-то лучшая практика, которой я не хватает?

  • 1
    «Пользователь может легко изменить ссылку и получить подробный вид для совершенно другого элемента». Это звучит как безопасность по незаметности. Держись подальше от этого! Я бы предложил использовать комбинацию $ routeParams и сервиса.
  • 0
    Задумывались ли вы о прослушивании события создания $on с первого контроллера и обойти данные в качестве параметра во втором контроллере?
Показать ещё 4 комментария

1 ответ

1
Лучший ответ

У вас есть две реальные альтернативы (которые вы определили):

  • Использовать услугу
  • Передайте информацию как часть URL-адреса

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

Поскольку вы поставляете кликабельную ссылку, имеет смысл, что вы связываетесь с чем-то, что связано (например, элемент или состояние, которое может быть идентифицировано с помощью уникального URL-адреса). Если вы считаете, что открытый элемент аккордеона является больше элементом состояния (в отличие от страницы), вы можете посмотреть на ui-router: https://github.com/angular-ui/ui-router

Я не уверен, почему вы не склонны иметь идентификаторы предметов в URL-адресе. Ведь любой, кто заинтересован, может видеть любую информацию в пользовательском интерфейсе с помощью инструментов разработчика. Если вам не нужны данные схемы базы данных в пользовательском интерфейсе, для решения этой проблемы существуют различные методы обфускации ID.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню