То, что я пытаюсь сделать:
У меня есть 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
в ссылке на мой детальный просмотр!
Это кажется довольно распространенным требованием. Есть ли какая-то лучшая практика, которой я не хватает?
У вас есть две реальные альтернативы (которые вы определили):
Оба являются технически правильными и жизнеспособными, но мое предпочтение от семантической и государственной точки зрения заключается в использовании URL-адреса.
Поскольку вы поставляете кликабельную ссылку, имеет смысл, что вы связываетесь с чем-то, что связано (например, элемент или состояние, которое может быть идентифицировано с помощью уникального URL-адреса). Если вы считаете, что открытый элемент аккордеона является больше элементом состояния (в отличие от страницы), вы можете посмотреть на ui-router: https://github.com/angular-ui/ui-router
Я не уверен, почему вы не склонны иметь идентификаторы предметов в URL-адресе. Ведь любой, кто заинтересован, может видеть любую информацию в пользовательском интерфейсе с помощью инструментов разработчика. Если вам не нужны данные схемы базы данных в пользовательском интерфейсе, для решения этой проблемы существуют различные методы обфускации ID.
$on
с первого контроллера и обойти данные в качестве параметра во втором контроллере?