Tenho uma situação com um formulário que se estende por várias páginas (pode não ser o ideal, mas é assim). Eu gostaria de ter um escopo para todo o formulário que é preenchido conforme você avança, de modo que, se o usuário alternar entre as etapas, seja fácil lembrar o estado.
Portanto, preciso fazer, em muito pseudocódigo:
- Conjunto
$scope.val = <Some dynamic data>
- Clique em um link e seja direcionado para um novo modelo (provavelmente com o mesmo controlador).
$scope.val
ainda deve ter o mesmo valor da última página.
De alguma forma, persistir dados para o escopo é a maneira certa de fazer isso, ou existe alguma outra maneira? Você pode até mesmo criar um controlador que tenha um escopo persistente entre as rotas, exceto para salvá-lo em um banco de dados, é claro.
scope
routes
angularjs
controllers
Erik Honn
fonte
fonte
Respostas:
Você precisa usar um serviço, pois um serviço persistirá ao longo da vida do seu aplicativo.
Digamos que você queira salvar dados pertencentes a um usuário
É assim que você define o serviço:
Em seu primeiro controlador:
fonte
Value Recipe
docs.angularjs.org/guide/providers , comomyApp.value('clientId', 'a12345654321x');
se também fosse persistente entre as rotas?O serviço funcionará, mas uma maneira lógica de fazê-lo usando apenas escopos e controladores comuns é configurar seus controladores e elementos de forma que reflitam a estrutura do seu modelo. Em particular, você precisa de um elemento pai e controlador que estabeleça um escopo pai. As páginas individuais do formulário devem residir em uma visualização filha do pai. O escopo pai persiste mesmo quando a visualização filho é atualizada.
Suponho que você esteja usando ui-router para que possa ter visualizações nomeadas aninhadas. Então, em pseudocódigo:
Em seguida, WizardController define as variáveis de escopo que você deseja preservar nas etapas do formulário de várias páginas (ao qual estou me referindo como um "assistente"). Então, suas rotas serão atualizadas
stepView
apenas. Cada etapa pode ter seus próprios modelos, controladores e escopos, mas seus escopos são perdidos de página para página. Mas os escopos em WizardController são preservados em todas as páginas.Para atualizar os escopos WizardController dos controladores filhos, você precisará usar sintaxe como
$scope.$parent.myProp = 'value'
ou definir uma funçãosetMyProp
em WizardController para cada variável de escopo. Caso contrário, se você tentar definir as variáveis de escopo pai diretamente dos controladores filhos, você acabará apenas criando uma nova variável de escopo no próprio filho, sombreando a variável pai.É meio difícil de explicar e peço desculpas pela falta de um exemplo completo. Basicamente, você deseja um controlador pai que estabeleça um escopo pai, que será preservado em todas as páginas do formulário.
fonte
$scope.$parent.myProp = 'hello world';
Os dados podem ser passados entre controladores de duas maneiras
$rootScope
O exemplo abaixo demonstra a passagem de valores usando o modelo
app.js
SharedService.js
// Modifique o valor no controlador A
Controller.js
// Acesse o valor no controlador dois
ControllerTwo.js
Espero que isto ajude.
fonte