Provavelmente pergunta boba, mas eu tenho meu formulário html com entrada e botão simples:
<input type="text" ng-model="searchText" />
<button ng-click="check()">Check!</button>
{{ searchText }}
Em seguida, no controlador (modelo e controlador são chamados de routeProvider):
$scope.check = function () {
console.log($scope.searchText);
}
Por que vejo a visualização atualizada corretamente, mas indefinida no console ao clicar no botão?
Obrigado!
Update: Parece que eu realmente resolvi esse problema (antes tive que apresentar algumas soluções alternativas) com: Só tive que alterar o nome da minha propriedade de searchText
para search.text
, em seguida, definir o $scope.search = {};
objeto vazio no controlador e pronto ... Não tenho idéia do por que está funcionando Apesar ;]
javascript
angularjs
data-binding
angular-ngmodel
alquimização
fonte
fonte
searchText
parasearch.text
, alguma idéia do porquê?voila
, nãovuala
,wolla
etc.Respostas:
Controlador como versão (recomendado)
Aqui o modelo
O JS
Um exemplo: http://codepen.io/Damax/pen/rjawoO
O melhor será usar o componente com Angular 2.x ou Angular 1.5 ou superior
########Caminho antigo (NÃO recomendado)
Isso NÃO é recomendado porque uma sequência é primitiva, altamente recomendável usar um objeto
Experimente isso na sua marcação
e isso no seu controlador
fonte
searchText
?"Se você usa o ng-model, tem que ter um ponto lá."
Faça o seu modelo apontar para uma propriedade object.property e você estará pronto.
Controlador
Modelo
Isso acontece quando os escopos filho estão em jogo - como rotas filho ou repetições de ng. O escopo filho cria seu próprio valor e um conflito de nome nasce como ilustrado aqui :
Veja este videoclipe para mais: https://www.youtube.com/watch?v=SBwoFkRjZvE&t=3m15s
fonte
Em Mastering Web Application Development with AngularJS book p.19, está escrito que
Os escopos são apenas objetos JavaScript e imitam a hierarquia de dom. De acordo com a herança do protótipo JavaScript , as propriedades dos escopos são separadas por escopos. Para evitar isso, a notação de ponto deve ser usada para vincular modelos ng.
fonte
Usando em
this
vez de$scope
obras.Edit: No momento em que escrevi esta resposta, eu tinha uma situação muito mais complicada do que isso. Após os comentários, tentei reproduzi-lo para entender por que funciona, mas sem sorte. Eu acho que de alguma forma (realmente não sei por quê) um novo escopo filho é gerado e
this
se refere a esse escopo. Mas se$scope
for usado, na verdade, ele se refere ao escopo pai $ por causa do javascript recurso de escopo lexical .Seria ótimo se alguém com esse problema testar dessa maneira e nos informar.
fonte
$scope
criam um novo escopo (ou seja, na funçãocheck()
,this
refere-se a um escopo que é um escopo filho$scope
). Por que é tão? Você pode dar algumas explicações?this.searchText = "something else"
ou mesmo se$scope.searchText = "something else"
, não atualizará a exibição. você pode explicar esse problema?Eu tive o mesmo problema e foi devido a mim não declarar o objeto em branco primeiro na parte superior do meu controlador:
Espero que isso funcione para você!
fonte
Me deparei com o mesmo problema ao lidar com uma visão não trivial (há escopos aninhados). E finalmente descobri que isso é uma coisa complicada conhecida ao desenvolver o aplicativo AngularJS devido à natureza da herança baseada em protótipo do java-script. Os escopos aninhados do AngularJS são criados por esse mecanismo. E o valor criado a partir do ng-model é colocado no escopo filho, sem dizer que o escopo pai (talvez aquele injetado no controlador) não verá o valor; o valor também sombreará qualquer propriedade com o mesmo nome definido no escopo pai, se não usar ponto para impor um acesso de referência de protótipo. Para obter mais detalhes, consulte o vídeo on-line específico para ilustrar esse problema, http://egghead.io/video/angularjs-the-dot/ e os comentários a seguir.
fonte
Dê uma olhada neste violino http://jsfiddle.net/ganarajpr/MSjqL/
Eu (presumo!) Fiz exatamente o que você estava fazendo e parece estar funcionando. Você pode verificar o que não está funcionando aqui para você?
fonte
Como ninguém mencionou isso, o problema pode ser resolvido adicionando
$parent
à propriedade boundE o controlador
fonte
Para mim, o problema foi resolvido armazenando meus dados em um objeto (aqui "dados").
Espero que ajude
fonte
Eu apenas tive esse problema usando um root_controller vinculado ao elemento do corpo. Então eu estava usando o ng-view com o roteador angular. O problema é que o angular SEMPRE cria um novo escopo quando ele insere o html no elemento ng-view. Como conseqüência, minha função "check" foi definida no escopo pai do escopo modificado pelo elemento ng-model.
Para resolver o problema, basta usar um controlador dedicado no conteúdo html carregado pela rota.
fonte
Você pode fazer isso para ativar a pesquisa em
ng-keypress
enter para inserir texto eng-click
para o ícone:fonte
Eu tive o mesmo problema.
A maneira correta seria definir o 'searchText' como uma propriedade dentro de um objeto.
Mas e se eu quiser deixar como está, uma corda? bem, eu tentei todos os métodos mencionados aqui, nada funcionou.
Mas então notei que o problema está apenas na iniciação, então acabei de definir o atributo value e funcionou.
Dessa forma, o valor é definido apenas como '$ scope.searchText' e está sendo atualizado quando o valor de entrada é alterado.
Eu sei que é uma solução alternativa, mas funcionou para mim ..
fonte
Eu estava enfrentando o mesmo problema ... A resolução que funcionou para mim é usar esta palavra-chave ..........
alerta (this.ModelName);
fonte