Este é um erro comum em novas aplicações angulares. Você não deseja gravar seus valores em seu HTML no servidor, se puder evitá-lo. De fato, se você pode evitar que seu servidor renderize HTML inteiramente, tanto melhor.
Idealmente, você deseja enviar seus modelos HTML angulares, puxe seus valores por $ http em JSON e coloque-os em seu escopo.
Portanto, se possível, faça o seguinte:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
Se você absolutamente DEVE renderizar seus valores em seu HTML a partir do seu servidor, você pode colocá-los em uma variável global e acessá-los com $ window:
No cabeçalho da sua página, você escreveria:
<head>
<script>
window.card = { description: 'foo' };
</script>
</head>
E então, no seu controlador, você o faria assim:
app.controller('MyController', function($scope, $window) {
$scope.card = $window.card;
});
Espero que ajude.
Se você não conseguir refazer o aplicativo para fazer o que o @blesh sugere (puxe os dados JSON para baixo com $ http ou $ resource e preencha o $ scope), use o ng-init em vez disso:
Consulte também AngularJS - O atributo Value em uma caixa de texto de entrada é ignorado quando há um modelo ng usado?
fonte
ng-init
é bastante útil ao definir valores de code-behind / postback<input name="phone" data-ng-model="frm.phone" data-ng-init="frm.phone= '<%: Model.Phone %>'" data-ng-pattern="/^[0-9() \-+]+$/" type="tel" required />
. Um pouco feio? Sim, mas faz o truque e resolve uma dor de cabeça de integração no processo.Esta é uma correção obviamente ausente, mas facilmente adicionada para o AngularJS. Basta escrever uma diretiva rápida para definir o valor do modelo no campo de entrada.
Aqui está a minha versão:
fonte
controller
para sua diretiva e por que não usou olink
método? Eu sou novato para AngularJSval = $attrs.ngInitial || $attrs.value || $element.val()
para que ele funcione com elementos selecionados.IMHO, a melhor solução é a diretiva @Kevin Stone, mas tive que atualizá-la para funcionar em todas as condições (fe select, textarea), e esta está funcionando com certeza:
fonte
Você pode usar uma diretiva personalizada (com suporte para área de texto, seleção, rádio e caixa de seleção), confira esta postagem no blog https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- campos-atributos / .
fonte
Você também pode usar dentro do seu código HTML:
ng-init="card.description = 12345"
Não é recomendado pela Angular e, como mencionado acima, você deve usar exclusivamente seu controlador.
Mas funciona :)
fonte
Eu tenho uma abordagem simples, porque tenho algumas validações e máscaras pesadas em meus formulários. Então, eu usei o jquery para obter meu valor novamente e acionar o evento "change" nas validações:
fonte
Como outros apontaram, não é uma boa prática inicializar dados nas visualizações. A inicialização dos dados nos controladores, no entanto, é recomendada. (consulte http://docs.angularjs.org/guide/controller )
Então você pode escrever
e
Dessa forma, as visualizações não contêm dados e o controlador inicializa o valor enquanto os valores reais estão sendo carregados.
fonte
Se você gosta da abordagem de Kevin Stone acima, https://stackoverflow.com/a/17823590/584761, considere uma abordagem mais fácil escrevendo diretivas para tags específicas, como 'input'.
Se você seguir esse caminho, não precisará se preocupar em adicionar ng-initial a cada tag. Ele define automaticamente o valor do modelo para o atributo value da tag. Se você não definir o atributo value, o padrão será uma sequência vazia.
fonte
Aqui está uma abordagem centrada no servidor:
É a mesma ideia básica que as respostas mais populares sobre esta questão, exceto que $ allow.value registra um serviço que contém seus valores padrão.
Portanto, no servidor, você pode ter algo como:
E coloque-o na sua página através da tecnologia do servidor de sua escolha. Aqui está uma lista: https://gist.github.com/exclsr/c8c391d16319b2d31a43
fonte
Esta é uma versão mais genérica das idéias mencionadas acima ... Simplesmente verifica se existe algum valor no modelo e, se não, define o valor para o modelo.
JS:
HTML (exemplo de uso):
fonte
$scope
para a chamada paragetter()
- espero que isso esclareça as coisas para qualquer pessoa que tente fazer isso!Eu tentei o que @Mark Rajcok sugeriu. Está trabalhando para valores String (Visa-4242). Por favor, consulte este violino .
Do violino:
A mesma coisa que é feita no violino pode ser feita usando
ng-repeat
, que todo mundo poderia recomendar. Mas depois de ler a resposta dada por Mark Rajcok, eu só queria tentar o mesmo para um formulário com uma variedade de perfis. As coisas funcionam bem até que eu tenha o $ scope.profiles = [{}, {}]; código no controlador. Se eu remover esse código, estou recebendo erros. Mas em cenários normais, não consigo imprimir$scope.profiles = [{},{}];
como imprimo ou ecoo html no servidor. Será possível executar o acima, de maneira semelhante ao @Mark Rajcok para os valores de sequência como<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
, sem ter que repetir a parte JavaScript do servidor.fonte
Acabei de adicionar suporte para o elemento select a Ryan Montgomery "consertar"
});
fonte
Se você possui o valor init na URL
mypage/id
, então, no controlador da JS angular, você pode usarlocation.pathname
para encontrar o ID e atribuí-lo ao modelo que deseja.fonte