Я пытаюсь разрешить пользователю редактировать список элементов с помощью ngRepeat
и ngModel
. ( См. Эту скрипку .) Однако оба подхода, которые я пробовал, приводят к странному поведению: один не обновляет модель, а другой размывает форму при каждом нажатии клавиши.
Я что-то здесь делаю не так? Разве это не поддерживаемый вариант использования?
Вот код скрипки, скопированный для удобства:
<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
Ник Хайнер
источник
источник
Ответы:
Это кажется обязательной проблемой.
Совет: не привязывайтесь к примитивам .
Вы
ngRepeat
выполняете итерацию по строкам внутри коллекции, тогда как она должна выполнять итерацию по объектам. Чтобы исправить вашу проблемуjsfiddle: http://jsfiddle.net/jaimem/rnw3u/5/
источник
Используя последнюю версию Angular (1.2.1) и следите за
$index
. Эта проблема исправленаhttp://jsfiddle.net/rnw3u/53/
источник
Вы попадаете в сложную ситуацию, когда необходимо понять, как работают scopes , ngRepeat и ngModel с NgModelController . Также попробуйте использовать версию 1.0.3. Ваш пример будет работать немного иначе.
Вы можете просто использовать решение, предоставленное jm-
Но если вы хотите разобраться в ситуации более глубоко, вы должны понимать:
Как ваш пример «Привязка к каждому элементу напрямую» работает для AngularJS 1.0.3:
'f'
во ввод;ngModelController
изменяет модель для охвата элемента (массив имен не изменяется) =>name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
;$digest
цикл запущен;ngRepeat
заменяет значение модели из области действия элемента ('Samf'
) на значение из массива неизмененных имен ('Sam'
);ngModelController
повторно отображает ввод с фактическим значением модели ('Sam'
).Как работает ваш пример «Индексирование в массив»:
'f'
во ввод;ngModelController
изменяет элемент в namesarray
=> `names == ['Samf', 'Harry', 'Sally'];ngRepeat
не могу найти'Samf'
в кеше;ngRepeat
создает новую область видимости, добавляет новый элемент div с новым вводом (поэтому поле ввода теряет фокус - старый div со старым вводом заменяется новым div с новым вводом);Кроме того, вы можете попробовать использовать AngularJS Batarang и посмотреть, как изменяет $ id области действия div с вводом, в который вы вводите.
источник
Если вам не нужно, чтобы модель обновлялась при каждом нажатии клавиши, просто выполните привязку,
name
а затем обновите элемент массива при событии размытия:источник
ng-model="names[$index]"
... Я знаю, что это обходной путь, но он работает ;-)Я только что обновил AngularJs до 1.1.2, и у меня с этим нет проблем. Думаю, этот баг был исправлен.
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
источник
Проблема, похоже, в том, как
ng-model
работаетinput
и перезаписываетname
объект, что делает его потерянным дляng-repeat
.В качестве обходного пути можно использовать следующий код:
Надеюсь, поможет
источник
Я попробовал решение выше для моей проблемы, и это сработало как шарм. Спасибо!
http://jsfiddle.net/leighboone/wn9Ym/7/
Вот моя версия этого:
и мой HTML
источник
как сделать что-то вроде:
И в моем элементе инспектора быть:
источник