angularjs'de olayı tetikleyen öğeye nasıl erişilir?


93

Web uygulamamda hem Bootstrap hem de AngularJS kullanıyorum. İkisinin birlikte çalışmasını sağlamakta biraz zorluk çekiyorum.

Özniteliğine sahip bir öğem var data-provide="typeahead"

<input id="searchText" ng-model="searchText" type="text"
       class="input-medium search-query" placeholder="title"
       data-provide="typeahead" ng-change="updateTypeahead()" />

Ve güncellemek istiyorum data-source kullanıcı alana girdi girdiğinde özniteliği . İşlev updateTypeaheaddoğru şekilde tetikleniyor, ancak $('#searchText')AngularJS yolu yerine jQuery yolu olan kullanmadığım sürece olayı tetikleyen öğeye erişimim yok .

AngularJS'nin eski stil JS modülü ile çalışmasını sağlamanın en iyi yolu nedir?

Yanıtlar:


59
 updateTypeahead(this)

DOM öğesini işleve aktarmayacaktır updateTypeahead(this). Burada thiskapsama değineceğiz. DOM öğesine erişmek istiyorsanız kullanın updateTypeahead($event). Geri arama işlevinde DOM öğesini kullanarak alabilirsiniz event.target.

Lütfen Dikkat: ng-change fonksiyonu, $ olayını değişken olarak geçirmeye izin vermez.


65
ng-change, parametre olarak iletilen olay nesnesi $ olayını desteklemez.
Mark Rajcok

1
ng tarzı göründüğü gibi desteklemiyor.
laggingreflex

4
Ayrıca olumsuz oy verildi. Ng sınıfı için çalışmıyor. $ olay tanımlanmadı! <li ng-repeat="item in items" role="menuitem" ng-class="{\'selected\' : isSelected($event, item)}">
Saad Benbouzid

4
Evet, soruya gerçekten cevap vermiyor, çünkü $ event ng-change ile çalışmıyor: /
Adrian Tombu

1
muhtemelen
SO'da

74

Bir olayı tetikleyen bir öğeye erişim sağlamanın genel Açısal yolu, bir yönerge yazmak ve istenen olaya bağlamaktır ():

app.directive('myChange', function() {
  return function(scope, element) {
    element.bind('change', function() {
      alert('change on ' + element);
    });
  };
});

veya DDO ile (@ tpartee'nin aşağıdaki yorumuna göre):

app.directive('myChange', function() {
  return { 
    link:  function link(scope, element) {
      element.bind('change', function() {
        alert('change on ' + element);
      });
    }
  }
});

Yukarıdaki yönerge şu şekilde kullanılabilir:

<input id="searchText" ng-model="searchText" type="text" my-change>

Plunker .

Metin alanına yazın, ardından bırakın / bulanıklaştırın. Değişiklik geri arama işlevi etkinleşir. Bu geri arama işlevinin içinden erişebilirsiniz element.

Bazı yerleşik yönergeler bir $ olay nesnesinin iletilmesini destekler. Örneğin ng- * tıklama, ng-Mouse *. Ng-değişiminin bu olayı desteklemediğini unutmayın.

Öğeyi $ olay nesnesi aracılığıyla da alabilirsiniz:

<button ng-click="clickit($event)">Hello</button>

$scope.clickit = function(e) {
    var elem = angular.element(e.srcElement);
    ...

bu "Angular yolunun derinliklerine" gider - Misko .


Çözümünüz işe yarasa da, DDO formatını kullanmıyor, bu da bağlama kapsamının nasıl ekleneceğini / geçileceğini anlamayı çok ama çok kafa karıştırıcı hale getiriyor. Örneğinizden, kapsam belirleme için biraz DDO şekeri eklemenin basit bir yolu yoktur ve bu, bir ng-tıklamadan $ olayını geçmek kadar derin bir şekilde "Açısal yola aykırı" görünür. Aslında resmi Angular dokümantasyon ve kod örneklerinde, sözdizimsel olarak sizinkine benzeyen tek bir örnek bulamadım (yani, herhangi bir DDO'suz yalnızca anonim bir işlevi döndüren bir yönerge).
tpartee

@tpartee, iyi puanlar. Başlangıçta bu cevabı yazdığımda, açısal dokümanlar, anonim bir işlevi (bağlantı işlevi olan) döndüren basit yönergelerin örneklerine sahipti. Bugünlerde bir DDO'nun daha iyi olacağına katılıyorum. Cevabı güncelledim.
Mark Rajcok

<Button ng-click = "clickit ($ event.srcElement)"> daha iyi olacağını düşünüyorum
Carlos ABS

1
Zaman geçtikçe, "Açısal yol" un aşırı karmaşık ve aşırı karmaşık olduğuna giderek daha fazla ikna oluyorum
Jacob Stamm

7

eleman üzerindeki bu ilk yazma olayı gibi kolayca alabilirsiniz

ng-focus="myfunction(this)"

ve js dosyanızda aşağıdaki gibi

$scope.myfunction= function (msg, $event) {
    var el = event.target
    console.log(el);
}

Ben de kullandım.


8
bu, kapsamı döndürür, bu nedenle beklendiği gibi çalışmaz.
vdclouis

1
Bu, OP'nin sorununu hiç çözmez. Elbette, bir işlevin aranan kişinin kim olduğunu bilmesine izin verir, ancak bunun ng-değişim çağrısıyla bir ilgisi yoktur ve ikisi arasında bir bağlantı yoktur. OP'nin ihtiyacı olan şey, yaptığı işlev çağrısı içinde ng-değişim olayını tetikleyen unsuru referans alabilmektir.
tpartee

Bu, öznitelikleri (örneğin, id): alert (event.target.id) ekleyerek çalışır.
Weihui Guo

2

Bu sorun için başka bir yönerge oluşturmak istemiyorsanız, denetleyicide $ element kullanan bir çözüm var:

appControllers.controller('YourCtrl', ['$scope', '$timeout', '$element',
        function($scope, $timeout, $element) {

    $scope.updateTypeahead = function() {
       // ... some logic here
       $timeout(function() {
           $element[0].getElementsByClassName('search-query')[0].focus();
           // if you have unique id you can use $window instead of $element:
           // $window.document.getElementById('searchText').focus();
       });
    }
}]);

Ve bu, ng-değişim ile çalışacaktır :

<input id="searchText" type="text" class="search-query" ng-change="updateTypeahead()" ng-model="searchText" />

0

ng-model değeri istiyorsanız, tetiklenen olayda şöyle yazabilirseniz: $ kapsam.searchText


0

Hangi sürüme sahip olduğunuzdan emin değilim, ancak bu soru uzun zaman önce sorulmuştu. Şu anda Angular 1.5 ile, benzer davranışları taklit etmek için Lodash'taking-keypress olayı ve debounceişlevi kullanabilirim , böylece $ olayını yakalayabilirimng-change

<input type="text" ng-keypress="edit($event)" ng-model="myModel">

$ kapsam.edit = _.debounce (fonksiyon ($ olay) {console.log ("$ olay", $ olay)}, 800)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.