Estou tentando permitir que o usuário edite uma lista de itens usando ngRepeat
e ngModel
. ( Veja este violino .) No entanto, as duas abordagens que tentei levam a um comportamento bizarro: uma não atualiza o modelo e a outra desfoca a forma em cada tecla.
Estou fazendo algo errado aqui? Este não é um caso de uso compatível?
Aqui está o código do violino, copiado por conveniência:
<html ng-app>
<head>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet">
</head>
<body ng-init="names = ['Sam', 'Harry', 'Sally']">
<h1>Fun with Fields and ngModel</h1>
<p>names: {{names}}</p>
<h3>Binding to each element directly:</h3>
<div ng-repeat="name in names">
Value: {{name}}
<input ng-model="name">
</div>
<p class="muted">The binding does not appear to be working: the value in the model is not changed.</p>
<h3>Indexing into the array:</h3>
<div ng-repeat="name in names">
Value: {{names[$index]}}
<input ng-model="names[$index]">
</div>
<p class="muted">Type one character, and the input field loses focus. However, the binding appears to be working correctly.</p>
</body>
</html>
angularjs
angularjs-ng-repeat
angularjs-ng-model
Nick Heiner
fonte
fonte
Respostas:
Este parece ser um problema vinculativo.
O conselho é não se vincular a primitivos .
Você
ngRepeat
está iterando em strings dentro de uma coleção, quando deveria estar iterando em objetos. Para consertar seu problemajsfiddle: http://jsfiddle.net/jaimem/rnw3u/5/
fonte
Usando a versão mais recente do Angular (1.2.1) e rastreado por
$index
. Este problema foi corrigidohttp://jsfiddle.net/rnw3u/53/
fonte
Você entra em uma situação difícil quando é necessário entender como escopos , ngRepeat e ngModel com NgModelController funcionam. Também tente usar a versão 1.0.3. Seu exemplo funcionará de maneira um pouco diferente.
Você pode simplesmente usar a solução fornecida por jm-
Mas se você quiser lidar com a situação mais profundamente, você deve entender:
Como seu exemplo "Vinculando a cada elemento diretamente" funciona para AngularJS 1.0.3:
'f'
na entrada;ngModelController
muda modelo de escopo item (variedade nomes não é alterado) =>name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
;$digest
loop é iniciado;ngRepeat
substitui o valor do modelo do escopo do item ('Samf'
) pelo valor do array de nomes inalterados ('Sam'
);ngModelController
renderiza novamente a entrada com o valor real do modelo ('Sam'
).Como funciona o seu exemplo "Indexação na matriz":
'f'
na entrada;ngModelController
muda o item em nomesarray
=> `nomes == ['Samf', 'Harry', 'Sally'];ngRepeat
não consigo encontrar'Samf'
no cache;ngRepeat
cria novo escopo, adiciona novo elemento div com nova entrada (é por isso que o campo de entrada perde o foco - div antigo com entrada antiga é substituído por novo div com nova entrada);Além disso, você pode tentar usar AngularJS Batarang e ver como muda $ id do escopo de div com a entrada na qual você insere.
fonte
Se você não precisa que o modelo seja atualizado a cada pressionamento de tecla, basta vincular
name
e atualizar o item da matriz no evento de desfoque:fonte
ng-model="names[$index]"
... Eu sei que é uma solução alternativa, mas funciona ;-)Acabei de atualizar o AngularJs para 1.1.2 e não tenho problemas com isso. Acho que esse bug foi corrigido.
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
fonte
O problema parece estar na maneira como
ng-model
funcionainput
e sobrescreve oname
objeto, tornando-o perdido parang-repeat
.Como alternativa, pode-se usar o seguinte código:
Espero que ajude
fonte
Eu tentei a solução acima para o meu problema e funcionou como um encanto. Obrigado!
http://jsfiddle.net/leighboone/wn9Ym/7/
Aqui está minha versão disso:
e meu HTML
fonte
como fazer algo como:
E no meu elemento inspetor seja:
fonte