У меня есть основной контроллер, который отображает мои продукты,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
На мой взгляд, я показываю эти продукты в списке
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
То, что я пытаюсь сделать, это когда кто-то нажимает на название продукта, у меня есть другое представление с именем корзина, в которую добавляется этот продукт.
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
Поэтому я сомневаюсь в том, как передать продукты, на которые нажали, с первого контроллера на второй? я предположил, что корзина должна быть контроллером тоже.
Я обрабатываю событие click, используя директиву. Также я чувствую, что должен использовать сервис для достижения вышеуказанной функциональности, просто не могу понять, как? потому что в корзине будет предопределенное количество добавленных товаров, может быть 5/10 в зависимости от того, на какой странице находится пользователь. Так что я хотел бы сохранить это общее.
Обновить:
Я создал сервис для трансляции и во втором контроллере я его получаю. Теперь вопрос, как я могу обновить дом? Поскольку мой список для отбрасывания продукта довольно жестко закодирован.
источник
Ответы:
Из описания кажется, что вы должны использовать сервис. Посетите http://egghead.io/lessons/angularjs-sharing-data-between-controllers и AngularJS Service, передающий данные между контроллерами, чтобы увидеть некоторые примеры.
Вы можете определить свой продукт службы (как фабрика), как таковой:
Зависимость внедряет сервис в оба контроллера.
В вашем
ProductController
, определите некоторое действие, которое добавляет выбранный объект в массив:В вашем
CartController
распоряжении товары из сервиса:источник
$http
вызов).По нажатию вы можете вызвать метод, который вызывает трансляцию :
и второй контроллер будет слушать этот тег как:
Так как мы не можем внедрить $ scope в сервисы, нет ничего лучше, чем singleton $ scope.
Но мы можем ввести
$rootScope
. Поэтому, если вы сохраняете значение в Сервисе, вы можете запустить его$rootScope.$broadcast('SOME_TAG', 'your value');
в теле Сервиса. (См. @Charx описание услуг)Пожалуйста, проверьте хорошую статью о трансляции $ , $ emit
источник
$rootScope.$broadcast
уведомляет все контроллеры, которые имеют параллельную структуру, то есть того же уровня.$watch
если значение существует на$rootScope
уровне. В противном случае только трансляция может уведомить другие контроллеры. К вашему сведению, если другой программист видит в вашем кодеbroadcast
- логика ясна, что вы пытаетесь сделать - «широковещательное событие». В любом случае, из моего опыта. его не рекомендуется использоватьrootscope
дляwatch
. О «только 1-й раз»: посмотрите на этот пример: plnkr.co/edit/5zqkj7iYloeHYkzK1Prt?p=preview у вас есть старые и новые значения. будьте уверены, что каждый раз, когда вы получаете новое значение, которое не совпадает со старымРешение без создания Сервиса с использованием $ rootScope:
Для совместного использования свойств через контроллеры приложения вы можете использовать Angular $ rootScope. Это еще один вариант обмена данными, чтобы люди знали об этом.
Предпочтительный способ обмена некоторыми функциями между контроллерами - это службы, для чтения или изменения глобального свойства вы можете использовать $ rootcope.
Использование $ rootScope в шаблоне (доступ к свойствам с помощью $ root):
источник
$rootScope
следует избегать как можно больше.Вы можете сделать это двумя способами.
Используя
$rootscope
, но я не рекомендую это. Это$rootScope
самая верхняя область применения. В приложении может быть только одно приложение,$rootScope
которое будет доступно всем компонентам приложения. Следовательно, он действует как глобальная переменная.Использование услуг. Вы можете сделать это, разделив сервис между двумя контроллерами. Код для сервиса может выглядеть так:
Вы можете увидеть мою скрипку здесь .
источник
Еще более простой способ обмена данными между контроллерами - использование вложенных структур данных. Вместо, например
мы можем использовать
data
Имущество будет наследоваться от родительской области , поэтому мы можем переписать свои поля, сохраняя доступ из других контроллеров.источник
источник
мы можем хранить данные в сеансе и использовать их в любом месте нашей программы.
Другое место
источник
Я видел ответы здесь, и он отвечает на вопрос об обмене данными между контроллерами, но что мне делать, если я хочу, чтобы один контроллер уведомил другой о том, что данные были изменены (без использования широковещательной передачи)? ЛЕГКО! Просто используя известный шаблон посетителей:
Таким простым способом один контроллер может обновить другой контроллер, если некоторые данные были обновлены.
источник
Я создал фабрику, которая управляет общей областью действия между шаблоном пути маршрута, поэтому вы можете поддерживать общие данные только тогда, когда пользователи переходят по одному и тому же родительскому пути маршрута.
Таким образом, если пользователь перейдет к другому пути маршрута, например, «/ Поддержка», общие данные для пути «/ Клиент» будут автоматически уничтожены. Но если вместо этого пользователь перейдет к «дочерним» путям, таким как «/ Customer / 1» или «/ Customer / list», область действия не будет уничтожена.
Вы можете увидеть образец здесь: http://plnkr.co/edit/OL8of9
источник
1
2
При нажатии вы можете вызвать метод, который вызывает трансляцию:
3
4
5
Один из способов использования углового сервиса:
источник
Создайте фабрику в вашем модуле и добавьте ссылку на фабрику в контроллере и используйте ее переменные в контроллере, а теперь получите значение данных в другом контроллере, добавив ссылку туда, где вы хотите
источник
Я не знаю, поможет ли это кому-нибудь, но, основываясь на ответе Charx (спасибо!), Я создал простой сервис кеширования. Не стесняйтесь использовать, делать ремиксы и делиться:
источник
Один из способов использования углового сервиса:
https://jsfiddle.net/1w64222q/
источник
К сведению, объект $ scope имеет $ emit, $ broadcast, $ on И объект $ rootScope имеет идентичный $ emit, $ broadcast, $ on
Подробнее о шаблоне публикации / подписки на английском языке здесь
источник
Чтобы улучшить решение, предложенное @Maxim с использованием $ broadcast, отправляйте данные без изменений
но для прослушивания данных
источник
Есть три способа сделать это,
а) используя сервис
б) Использование зависимых родительских / дочерних отношений между областями контроллера.
в) В Angular 2.0 ключевое слово «как» будет передавать данные с одного контроллера на другой.
Для получения дополнительной информации с примером, пожалуйста, проверьте ссылку ниже:
http://www.tutespace.com/2016/03/angular-js.html
источник
Первый контроллер
Второй контроллер
источник
я думаю
лучший способ
это использовать $ localStorage. (Работает все время)Ваша карта будет
Вы также можете добавить
источник