2013-06-09 20 views
13

AngularJS kullanıyorum.ng değişimini tetikleyen DOM öğesi nasıl alınır?

Ben updateUserData işlev içinde güncellenen var olan DOM öğesi belirlemek mümkün istiyorum
<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData()"> 

, elle belirtmek zorunda kalmadan: Ben mesela ng-change kendi ile sayfamda <select> birkaç elemanları, her var Her bir ng-change özniteliği için bir parametre olarak.

event veya caller veya updateUserData bağlamında kullanabileceğim benzer bir şey var mı? ng-change="updateUserData(caller)"

+0

http://stackoverflow.com/questions/ 48239/it-the-id-of-the-öğe-bu-ateş-bir-olay-kullanarak-jquery – Arunu

+2

@Arunu AngularJS kullanıyorum, jQuery değil. Soruyu daha net hale getirmek için yeni düzenledim. – OpherV

cevap

11

gibi

Umarım şey tasarımla bu yapmak için hiçbir (kolay) yolu var. Köşeli kontrolörlerin DOM'den tamamen ayrı olması gerekiyor, bu yüzden kendilerinizde DOM'a başvurmaya ihtiyaç duyuyorsanız, büyük olasılıkla yanlış yola yaklaşıyorsunuz demektir.

HTML Sonra denetleyicisi $scope.hairColor değerini değiştirecek seçme değişen

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

ise. updateUserData()'da sadece değerini okuyun ve buna göre hareket edin.

Durumunuzda, DOM'a başvurmak dışında bunu yapmanın gerçekten bir yolu yoksa, özel bir yönerge yazarak bunu yapabilirsiniz. Genel olarak, Angular'daki doğrudan DOM manipülasyonu, yine de bir son önlem türü olmalıdır.

+0

Korktuğum şey buydu. Hangi verilerin değiştirildiğini kaydetmek için DOM öğesinin kimliğini almaya çalışıyorum. Bundan sonra nasıl farklı olurdun? her veri öğesini ayrı ayrı "izle" – OpherV

+1

Tam durumunuzdan emin değilim, ancak bununla bir şey yapabilmeniz için bir ng modeline sahip olmanızın bile eleman üzerinde bir kimliğe sahip olmanın bile gerekli olmadığını buldum. Her bir seçim için $ watch veya ayrı bir ng-change metoduna sahip olabilirsiniz. Bildiğim DRY değil, DOM ve kontrol ünitelerini ayrı tutmak, uzun vadede bakım/test için hayatı çok daha kolay hale getiriyor. – mikel

2

Bunu Google'da buldum, sonunda sorunumu çözdüm, işte çözümüm.

Yalnızca kimliğe ihtiyacınız varsa, bunu her zaman bir parametre olarak iletebilirsiniz.

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

Hala süper temiz değil, ancak sorunumu çözdü. Gerçekte dom elemanına ihtiyacım olduğu için, elementi almak için jQuery'yi kullandım.

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

(O eski kodu dönüştürme ile elimden geleni yapıyorum, merak edenler için "sihirli" Tüm web sitesi üzerinden sayfalarda kullanıcı ayarlarını kaydeder.)

+0

'Açısal' yol değil. UI'yi bir denetleyiciden değiştiriyorsunuz, direktiflerin ne için olduğunu. – Dementic

İlgili konular