Tengo un controlador básico que muestra mis productos,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
En mi opinión, estoy mostrando estos productos en una lista
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
Lo que intento hacer es cuando alguien hace clic en el nombre del producto, tengo otra vista llamada carrito donde se agrega este producto.
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
Entonces mi duda aquí es, ¿cómo pasar estos productos clicados del primer controlador al segundo? Supuse que el carro también debería ser un controlador.
Manejo eventos click usando directiva. También creo que debería estar utilizando el servicio para lograr la funcionalidad anterior, pero no puedo entender cómo. debido a que el carrito tendrá un número predefinido de productos agregados, podría ser 5/10 dependiendo de la página del usuario. Entonces me gustaría mantener esto genérico.
Actualizar:
Creé un servicio para transmitir y en el segundo controlador lo recibo. Ahora la consulta es ¿cómo actualizo dom? Dado que mi lista para dejar caer el producto está bastante codificada.
fuente
Respuestas:
Según la descripción, parece que debería estar utilizando un servicio. Consulte http://egghead.io/lessons/angularjs-sharing-data-between-controllers y AngularJS Service Passing Data Between Controllers para ver algunos ejemplos.
Puede definir el servicio de su producto (como fábrica) como tal:
La dependencia inyecta el servicio en ambos controladores.
En su
ProductController
, defina alguna acción que agregue el objeto seleccionado a la matriz:En su
CartController
, obtenga los productos del servicio:fuente
$http
llamada, por ejemplo).Al hacer clic, puede llamar al método que invoca la transmisión :
y el segundo controlador escuchará en esta etiqueta como:
Como no podemos inyectar $ scope en los servicios, no hay nada como un singleton $ scope.
Pero podemos inyectar
$rootScope
. Entonces, si almacena valor en el Servicio, puede ejecutarlo$rootScope.$broadcast('SOME_TAG', 'your value');
en el cuerpo del Servicio. (Consulte la descripción de @Charx sobre los servicios)Por favor revise un buen artículo sobre $ broadcast , $ emit
fuente
$rootScope.$broadcast
notifica a todos los controladores que tienen una estructura paralela, también conocido como el mismo nivel.$watch
si el valor existe en el$rootScope
nivel. De lo contrario, solo la transmisión podría notificar a otros controladores. Para su información, si otro programador ve en su códigobroadcast
- la lógica es clara lo que intenta hacer - "evento de difusión". De todos modos, desde mi exp. no es una buena práctica utilizarrootscope
parawatch
. Acerca de "disparar solo por primera vez": eche un vistazo a este ejemplo: plnkr.co/edit/5zqkj7iYloeHYkzK1Prt?p=preview tiene valores antiguos y nuevos. asegúrese de que cada vez que obtenga un nuevo valor que no sea igual al anteriorSolución sin crear Servicio, usando $ rootScope:
Para compartir propiedades entre los Controladores de aplicaciones, puede usar Angular $ rootScope. Esta es otra opción para compartir datos, para que la gente lo sepa.
La forma preferida de compartir algunas funciones entre los Controladores es Servicios, para leer o cambiar una propiedad global puede usar $ rootscope.
Usando $ rootScope en una plantilla (Propiedades de acceso con $ root):
fuente
$rootScope
debe evitarse tanto como sea posible.Puedes hacer esto por dos métodos.
Al usar
$rootscope
, pero no recomiendo esto. El$rootScope
es el alcance más alto. Una aplicación solo puede tener una$rootScope
que se compartirá entre todos los componentes de una aplicación. Por lo tanto, actúa como una variable global.Utilizando servicios. Puede hacerlo compartiendo un servicio entre dos controladores. El código de servicio puede verse así:
Puedes ver mi violín aquí .
fuente
Una forma aún más simple de compartir los datos entre los controladores es usar estructuras de datos anidados. En lugar de, por ejemplo
nosotros podemos usar
La
data
propiedad se heredará del ámbito primario para que podamos sobrescribir sus campos, manteniendo el acceso desde otros controladores.fuente
fuente
Podemos almacenar datos en sesión y usarlos en cualquier parte de nuestro programa.
Otro lugar
fuente
Vi las respuestas aquí, y está respondiendo a la pregunta de compartir datos entre los controladores, pero ¿qué debo hacer si quiero que un controlador notifique al otro sobre el hecho de que los datos han cambiado (sin usar la transmisión)? ¡FÁCIL! Simplemente usando el famoso patrón de visitante:
De esta manera simple, un controlador puede actualizar otro controlador que algunos datos han sido actualizados.
fuente
Creé una fábrica que controla el alcance compartido entre el patrón de ruta de ruta, para que pueda mantener los datos compartidos justo cuando los usuarios navegan en la misma ruta principal de ruta.
Por lo tanto, si el usuario va a otra ruta de ruta, por ejemplo '/ Soporte', los datos compartidos para la ruta '/ Cliente' se destruirán automáticamente. Pero, si en lugar de esto, el usuario va a rutas 'secundarias', como '/ Cliente / 1' o '/ Cliente / lista', el alcance no se destruirá.
Puede ver una muestra aquí: http://plnkr.co/edit/OL8of9
fuente
1
2
Al hacer clic, puede llamar al método que invoca la transmisión:
3
4 4
5 5
Una forma de usar el servicio angular:
fuente
Haga una fábrica en su módulo y agregue una referencia de la fábrica en el controlador y use sus variables en el controlador y ahora obtenga el valor de los datos en otro controlador agregando la referencia donde quiera
fuente
No sé si ayudará a alguien, pero según la respuesta de Charx (¡gracias!), He creado un servicio de caché simple. Siéntase libre de usar, mezclar y compartir:
fuente
Una forma de usar el servicio angular:
https://jsfiddle.net/1w64222q/
fuente
FYI El objeto $ scope tiene $ emit, $ broadcast, $ on Y el objeto $ rootScope tiene idéntico $ emit, $ broadcast, $ on
Lea más sobre el patrón de diseño de publicación / suscripción en angular aquí
fuente
Para mejorar la solución propuesta por @Maxim usando $ broadcast, los datos de envío no cambian
pero a escuchar datos
fuente
Hay tres formas de hacerlo.
a) usar un servicio
b) Explotar la relación padre / hijo dependiente entre los ámbitos del controlador.
c) En Angular 2.0, la palabra clave "As" pasará los datos de un controlador a otro.
Para obtener más información con ejemplos, consulte el siguiente enlace:
http://www.tutespace.com/2016/03/angular-js.html
fuente
Primer controlador
Segundo controlador
fuente
Pienso que el
mejor manera
es usar $ localStorage. (Funciona todo el tiempo)Su cardController será
También puedes agregar
fuente