Próbuję zezwolić użytkownikowi na edycję listy elementów za pomocą ngRepeat
i ngModel
. ( Zobacz to skrzypce .) Jednak oba podejścia, które wypróbowałem, prowadziły do dziwacznego zachowania: jedno nie aktualizuje modelu, a drugie zaciera formularz przy każdym keydown.
Czy ja tu robię coś złego? Czy to nie jest obsługiwany przypadek użycia?
Oto kod ze skrzypiec, skopiowany dla wygody:
<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>
Wcześniejsze
angularjs
angularjs-ng-repeat
angularjs-ng-model
Nick Heiner
źródło
źródło
Odpowiedzi:
Wydaje się, że jest to wiążąca kwestia.
Rada brzmi : nie wiąż się z prymitywami .
Twój
ngRepeat
jest iteracja na smyczki wewnątrz kolekcji, gdy powinna być Iterowanie nad obiektami. Aby rozwiązać twój problemjsfiddle: http://jsfiddle.net/jaimem/rnw3u/5/
źródło
Korzystanie z najnowszej wersji Angular (1.2.1) i śledzenie według
$index
. Ten problem został rozwiązanyhttp://jsfiddle.net/rnw3u/53/
źródło
Wpadasz w trudną sytuację, gdy konieczne jest zrozumienie, jak działają zakresy , ngRepeat i ngModel z NgModelController . Spróbuj także użyć wersji 1.0.3. Twój przykład zadziała trochę inaczej.
Możesz po prostu skorzystać z rozwiązania dostarczonego przez jm-
Ale jeśli chcesz dokładniej zająć się sytuacją, musisz zrozumieć:
Jak Twój przykład „Bezpośrednie powiązanie z każdym elementem” działa w AngularJS 1.0.3:
'f'
do wejścia;ngModelController
zmienia model dla zakresu przedmiotu (nazwy tablica nie zostanie zmieniona) =>name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
;$digest
pętla jest uruchomiona;ngRepeat
zastępuje wartość modelu z zakresu pozycji ('Samf'
) wartością z niezmienionej tablicy nazw ('Sam'
);ngModelController
rerenderuje dane wejściowe z rzeczywistą wartością modelu ('Sam'
).Jak działa Twój przykład „Indeksowanie do tablicy”:
'f'
do wejścia;ngModelController
zmienia element w namesarray
=> `names == ['Samf', 'Harry', 'Sally'];ngRepeat
nie można znaleźć'Samf'
w pamięci podręcznej;ngRepeat
tworzy nowy zakres, dodaje nowy element div z nowym wejściem (dlatego pole wejściowe traci fokus - stary div ze starym wejściem jest zastępowany nowym div z nowym wejściem);Możesz także spróbować użyć AngularJS Batarang i zobaczyć, jak zmienia się $ id zakresu div na dane wejściowe, w które wpisujesz.
źródło
Jeśli nie potrzebujesz aktualizować modelu po każdym naciśnięciu klawisza, po prostu połącz się z,
name
a następnie zaktualizuj element tablicy przy zdarzeniu rozmycia:źródło
ng-model="names[$index]"
... Wiem, że to obejście, ale działa ;-)Właśnie zaktualizowałem AngularJs do wersji 1.1.2 i nie mam z tym problemu. Myślę, że ten błąd został naprawiony.
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
źródło
Wydaje się, że problem tkwi w sposobie, w jaki
ng-model
działa z obiekteminput
i nadpisuje goname
, przez co zostaje utraconyng-repeat
.Aby obejść ten problem, można użyć następującego kodu:
Mam nadzieję, że to pomoże
źródło
Wypróbowałem powyższe rozwiązanie dla mojego problemu, które działało jak urok. Dzięki!
http://jsfiddle.net/leighboone/wn9Ym/7/
Oto moja wersja:
i mój HTML
źródło
jak coś takiego:
A w moim elemencie inspektora:
źródło