Próbuję uporać się z innym zachowaniem ngModel
w różnych przeglądarkach.ngModel - Jak radzić sobie z jego różnymi zachowaniami w różnych przeglądarkach?
Moja dyrektywa otacza proces autouzupełniania JQueryUI i wywołuje select
zdarzenie, które wywołuje ngModel.$setViewValue(selectedItem.id)
. Autouzupełnianie pozwala użytkownikowi wybrać pozycję jednym kliknięciem myszy lub naciskając enter
na klawiaturze.
Jeśli pozycja jest sugerowane:
{
"name": "Apple",
"id": "1000"
}
się spodziewać po wybraniu go, wartość ngModel zostanie wybrana pozycja na id
- 1000
.
W Chrome działa OK - ustawia
$viewValue
i$modelValue
poprawnie ($modelValue=1000
).W Firefoksie ustawia modelu jak w Chrome (
$modelValue=1000
), ale po kliknięciu gdzieś indziej - zrobić rozmazania (wówczas przeglądarka prawdopodobnie odpalachange
zdarzenie), zmiany modelu i staje się tak samo jak widocznej wartości wejściowej ($modelValue='Apple'
).W IE 11 ustawia model tylko wtedy, gdy zaznaczam element za pomocą kliknięcia myszką. Gdybym wybierz ją, naciskając
enter
, model staje się widoczna wartość wejściowa ($modelValue='Apple'
)
Oto plunkr: http://plnkr.co/edit/o2Jkgprf8EakGqnpu22Y?p=preview
chciałbym osiągnąć to samo zachowanie w każdej przeglądarce. Jak sobie z tym poradzić?
Wydaje mi się, że zdecydowanie lepiej jest używać dwóch różnych modeli, z których jedna ma rozpoznaną wartość asynchroniczną (prawdopodobnie prywatną) i taką, której używa użytkownik do wpisania zapytania (publiczne). W obecnej formie, gdy wpiszesz kompletną fałszywą nazwę (taką, której nie ma na liście owoców), będzie to wartość modelu. Co prawdopodobnie nie jest pomocne, gdy spodziewasz się, że będzie to dowód osobisty. – Yoshi
@Yoshi, To, o czym wspomniałeś, jest tylko usprawnieniem sprawdzania poprawności - użytkownik nie będzie mógł wpisać czegoś innego niż id, ale to nie rozwiąże problemu. (Albo nie wiem jak to właściwie zaimplementować). Dzięki twoim podpowiedziom będzie to coś takiego: http://plnkr.co/edit/7nCAEhIXX2wGNR18eRqk. '$ modelValue = null' dla fałszywych nazw, ale w funkcji parseera firefox nadal jest uruchamiany ponownie przy rozmyciu, więc tracę wybraną wartość. – akn
Jeśli są to tylko zdarzenia, możesz spróbować użyć ['ngModelOptions.updateOn'] (https://docs.angularjs.org/api/ng/directive/ngModelOptions). – Yoshi