Eu tenho um controlador básico que exibe meus produtos,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
Na minha opinião, estou exibindo esses produtos em uma lista
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
O que estou tentando fazer é que, quando alguém clica no nome do produto, tenho outra exibição chamada carrinho, onde esse produto é adicionado.
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
Então, minha dúvida aqui é: como passar esses produtos clicados do primeiro controlador para o segundo? Eu assumi que o carrinho deveria ser um controlador também.
Eu trato de evento de clique usando diretiva. Também sinto que eu deveria estar usando o serviço para alcançar a funcionalidade acima apenas não consigo descobrir como? porque o carrinho terá um número predefinido de produtos adicionados, pode ser 5/10, dependendo de qual usuário da página é. Então, eu gostaria de manter este genérico.
Atualizar:
Eu criei um serviço para transmitir e no segundo controlador eu o recebo. Agora a consulta é como atualizo o dom? Desde a minha lista para soltar o produto é bastante codificado.
fonte
Respostas:
A partir da descrição, parece que você deveria estar usando um serviço. Confira http://egghead.io/lessons/angularjs-sharing-data-between-controllers e o serviço AngularJS passando dados entre controladores para ver alguns exemplos.
Você pode definir o serviço do produto (como uma fábrica) como tal:
A dependência injeta o serviço nos dois controladores.
No seu
ProductController
, defina alguma ação que adicione o objeto selecionado à matriz:No seu
CartController
, obtenha os produtos do serviço:fonte
$http
chamada, por exemplo).Ao clicar, você pode chamar o método que chama a transmissão :
e o segundo controlador ouvirá essa tag como:
Como não podemos injetar $ scope em serviços, não há nada como um singleton $ scope.
Mas nós podemos injetar
$rootScope
. Portanto, se você armazenar valor no Serviço, poderá executar$rootScope.$broadcast('SOME_TAG', 'your value');
no corpo do Serviço. (Consulte a descrição @Charx sobre serviços)Por favor, verifique um bom artigo sobre $ broadcast , $ emit
fonte
$rootScope.$broadcast
notifica todos os controladores que possuem estrutura paralela, ou seja, o mesmo nível.$watch
se o valor existir no$rootScope
nível. Caso contrário, apenas a transmissão poderá notificar outros controladores. Para sua informação, se outro programador vir em seu códigobroadcast
- a lógica é clara o que você tenta fazer - "evento de transmissão". De qualquer forma, da minha exp. não é boa prática usarrootscope
parawatch
. Sobre "acionar apenas a 1ª vez": veja este exemplo: plnkr.co/edit/5zqkj7iYloeHYkzK1Prt?p=preview você tem valores antigos e novos. certifique-se de que cada vez que você começa novo valor que does not igual a um velhoSolução sem criar Serviço, usando $ rootScope:
Para compartilhar propriedades entre os Controladores de aplicativos, você pode usar Angular $ rootScope. Essa é outra opção para compartilhar dados, colocando-os para que as pessoas saibam sobre eles.
A maneira preferida de compartilhar alguma funcionalidade entre os Controladores é Serviços, para ler ou alterar uma propriedade global, você pode usar $ rootscope.
Usando $ rootScope em um modelo (acesse as propriedades com $ root):
fonte
$rootScope
deve ser evitado o máximo possível.Você pode fazer isso por dois métodos.
Ao usar
$rootscope
, mas não recomendo isso. O$rootScope
é o escopo mais alto. Um aplicativo pode ter apenas um$rootScope
que será compartilhado entre todos os componentes de um aplicativo. Portanto, ele atua como uma variável global.Usando serviços. Você pode fazer isso compartilhando um serviço entre dois controladores. O código de serviço pode ser assim:
Você pode ver meu violino aqui .
fonte
Uma maneira ainda mais simples de compartilhar os dados entre controladores é usar estruturas de dados aninhadas. Em vez de, por exemplo
podemos usar
A
data
propriedade será herdada do escopo pai, para que possamos sobrescrever seus campos, mantendo o acesso de outros controladores.fonte
fonte
podemos armazenar dados em sessão e usá-los em qualquer lugar do programa.
Outro lugar
fonte
Eu vi as respostas aqui e ele está respondendo à questão do compartilhamento de dados entre controladores, mas o que devo fazer se quiser que um controlador notifique o outro sobre o fato de que os dados foram alterados (sem usar a transmissão)? FÁCIL! Apenas usando o famoso padrão de visitante:
Dessa maneira simples, um controlador pode atualizar outro controlador que alguns dados foram atualizados.
fonte
Criei uma fábrica que controla o escopo compartilhado entre o padrão do caminho da rota, para que você possa manter os dados compartilhados apenas quando os usuários estiverem navegando no mesmo caminho pai da rota.
Portanto, se o usuário for para outro caminho de rota, por exemplo '/ Support', os dados compartilhados para o caminho '/ Customer' serão automaticamente destruídos. Mas se, em vez disso, o usuário seguir para caminhos 'filho', como '/ Customer / 1' ou '/ Customer / list', o escopo não será destruído.
Você pode ver uma amostra aqui: http://plnkr.co/edit/OL8of9
fonte
1
2
Ao clicar, você pode chamar o método que chama a transmissão:
3
4
5
Uma maneira de usar o serviço angular:
fonte
Faça uma fábrica no seu módulo e adicione uma referência da fábrica no controlador e use suas variáveis no controlador e agora obtenha o valor dos dados em outro controlador adicionando referência onde quer que você queira
fonte
Não sei se isso ajudará alguém, mas com base na resposta do Charx (obrigado!), Criei um serviço de cache simples. Sinta-se livre para usar, remixar e compartilhar:
fonte
Uma maneira de usar o serviço angular:
https://jsfiddle.net/1w64222q/
fonte
Para sua informação, o objeto $ scope tem o $ emit, $ broadcast, $ on E o objeto $ rootScope possui o idêntico $ emit, $ broadcast, $ on
leia mais sobre o padrão de design de publicação / assinatura em angular aqui
fonte
Para melhorar a solução proposta pelo @Maxim usando $ broadcast, envie os dados não mudam
mas ouvindo dados
fonte
Existem três maneiras de fazer isso,
a) usando um serviço
b) Explorar a relação pai / filho dependente entre os escopos do controlador.
c) No Angular 2.0, a palavra-chave "As" passará os dados de um controlador para outro.
Para mais informações, por exemplo, verifique o link abaixo:
http://www.tutespace.com/2016/03/angular-js.html
fonte
Primeiro Controlador
Segundo Controlador
fonte
Eu acho que o
melhor maneira
é usar $ localStorage. (Funciona o tempo todo)O seu controlador de cartão será
Você também pode adicionar
fonte