2013-06-09 16 views
13

Używam angularJS. Mam kilka <select> elementów na mojej stronie, każdy z własnym ng-change, na przykład:Jak uzyskać element DOM, który wywołał zmianę Ng?

<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData()"> 

Chcę być w stanie określić, które DOM Element został zaktualizowany od wewnątrz funkcji updateUserData, bez konieczności ręcznego określić ją jako parametr dla każdego atrybutu ng-change.

Czy istnieje event lub caller lub coś podobnego, z którego mogę korzystać w kontekście updateUserData?

Mam nadzieję, że coś ng-change="updateUserData(caller)"

+0

http://stackoverflow.com/questions/ 48239/get-the-id-of-the-element-that-fired-an-event-using-jquery – Arunu

+2

@Arunu Używam AngularJS, a nie jQuery. Właśnie zredagowałem pytanie, aby było jaśniejsze. – OpherV

Odpowiedz

11

Nie ma (łatwy) sposób to zrobić z projektem. Sterowniki kątowe powinny być całkowicie oddzielone od DOM, więc jeśli będziesz potrzebować odwoływać się do DOM, prawdopodobnie zbliżasz się do nich w niewłaściwy sposób.

Jeżeli HTML jest

<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData()"> 

następnie zmieniając select zmieni wartość $scope.hairColor w kontrolerze. W updateUserData() po prostu odczytaj jego wartość i postępuj odpowiednio.

Jeśli w Twojej sytuacji naprawdę nie ma sposobu, aby to zrobić poza odniesieniem do DOM, możesz to zrobić, pisząc niestandardową dyrektywę. Ogólnie rzecz biorąc, bezpośrednia manipulacja DOM w Angular powinna być ostatecznym środkiem pomiaru.

+0

Tego właśnie się obawiałem. Próbuję uzyskać identyfikator elementu DOM, aby zarejestrować, które dane zostały zmienione. Jak byś zmienił to inaczej? '$ Obejrzyj' każdy element danych osobno? – OpherV

+1

Nie jestem pewien twojej dokładnej sytuacji, ale okazało się, że nie jest konieczne posiadanie identyfikatora na elemencie, jeśli masz model ng, ponieważ zamiast tego możesz zrobić wszystko. Możesz $ obejrzeć lub mieć oddzielną metodę zmiany dla każdego zaznaczenia. Nie jest to również SUCHO, które znam, ale utrzymanie rozdzielności DOM i kontrolerów znacznie ułatwia życie/testowanie w dłuższej perspektywie. – mikel

2

Znalazłem to w google, ostatecznie rozwiązałem mój problem, więc oto moje rozwiązanie.

Jeśli potrzebujesz tylko ID, możesz go po prostu przekazać jako parametr.

<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData('hairColorComponent')"> 

Nadal nie jest super czysty, ale rozwiązał mój problem. Ponieważ faktycznie potrzebowałem elementu dom, użyłem jQuery, aby uzyskać element.

$scope.updateUserData = function (id) { 
    var element = jQuery('#'+id); 
}; 

(Dla tych, zastanawiając się, robię mój najlepszy z konwersji kodu starszego typu, że „magicznie” zapisuje ustawienia użytkownika na stronach całej stronie).

+0

Nie w sposób "kątowy". modyfikujesz interfejs użytkownika z kontrolera, do tego służą dyrektywy. – Dementic

Powiązane problemy