2013-04-22 12 views
23

Jak mogę wywołać zdarzenie click dla elementów li określających ich indeks z dyrektywy angularjs? Próbowałem używać $ pierwszy do wyzwalania kliknij pierwszy element, ale nie działa.Zdarzenie kliknięcia wyzwalacza z dyrektywy angularjs

Dzięki za pomoc.

+4

Czy możesz opublikować kod, który próbujesz. – lucuma

+0

Czy mówisz, że chcesz wywołać zdarzenie kliknięcia za pomocą kodu? Dlaczego chcesz to zrobić? – tamakisquare

+0

Próbuję wyświetlić obrazy na liście. Chcę wyświetlać pierwszy obraz domyślnie po załadowaniu strony. Proszę zobaczyć plunker poniżej. W tej chwili robię to za pomocą funkcji timeout jQuery, która nie jest optymalnym rozwiązaniem, ale trzeba to zmienić na angularjs. http://plnkr.co/edit/CVnp9FKcIMr7GoSpfcoX – ayimos

Odpowiedz

35

Oto prawdopodobnie inny sposób, aby to osiągnąć. Przechodzą do dyrektywy zarówno indeksu i elementu i pozwól dyrektywy Setup HTML w szablonie:

Demo: http://plnkr.co/edit/ybcNosdPA76J1IqXjcGG?p=preview

html:

<ul id="thumbnails"> 
    <li class="thumbnail" ng-repeat="item in items" options='#my-container' itemdata='item' index="$index"> 

    </li> 
    </ul> 

js dyrektywy:

app.directive('thumbnail', [function() { 
    return { 
    restrict: 'CA', 
    replace: false, 
    transclude: false, 
    scope: { 
     index: '=index', 
     item: '=itemdata' 
    }, 
    template: '<a href="#"><img src="{{item.src}}" alt="{{item.alt}}" /></a>', 
    link: function(scope, elem, attrs) { 
     if (parseInt(scope.index) == 0) { 
      angular.element(attrs.options).css({'background-image':'url('+ scope.item.src +')'}); 
     } 

     elem.bind('click', function() { 
      var src = elem.find('img').attr('src'); 

      // call your SmoothZoom here 
      angular.element(attrs.options).css({'background-image':'url('+ scope.item.src +')'}); 
     }); 
    } 
} 
}]); 

Prawdopodobnie lepiej byłoby dodać ng-kliknięcie do obrazu, jak wskazano w innej odpowiedzi.

Aktualizacja

Link do demo było nieprawidłowe. Został zaktualizowany do: http://plnkr.co/edit/ybcNosdPA76J1IqXjcGG?p=preview

+0

Musisz zapisać swój plik i zaktualizować adres URL! – Langdon

+0

Dzięki, został zaktualizowany. – lucuma

+0

faceci, co mamy na myśli przez restrict = 'CA' w powyższym przykładzie? Widziałem C i A, ale czym jest CA? –

8

To więcej kątowego sposób to zrobić: http://plnkr.co/edit/xYNX47EsYvl4aRuGZmvo?p=preview

  1. dodałem $ scope.selectedItem że dostaje piłkę pierwszego problemu (zwłoce obraz)
  2. dodałem $ scope.setSelectedItem i nazywa to w ng-click. Twoje ostateczne wymagania mogą być różne, ale przy użyciu dyrektywy wiążą click i zmienić src było przesadą, ponieważ większość z nich mogą być obsługiwane z szablonem
  3. korzystanie Zawiadomienie o ngSrc aby uniknąć błędny połączeń serwera, na wstępnym obciążeniem
  4. Będziesz trzeba dostosować niektóre style, aby uzyskać obraz umieszczony bezpośrednio w div. Jeśli naprawdę potrzebujesz użyć background-image, potrzebujesz dyrektywy, takiej jak ngSrc, która odradza ustawianie stylu background-image, dopóki nie zostaną załadowane prawdziwe dane.
2

Jest to rozszerzenie do odpowiedzi Langdona z dyrektywnym podejściem do problemu. Jeśli zamierzasz mieć wiele galerii na stronie, może to być jeden ze sposobów na obejście tego bez większego zamieszania.

Zastosowanie:

<gallery images="items"></gallery> 
<gallery images="cats"></gallery> 

See it working here

0

W ten sposób udało mi się wywołać kliknięcie przycisku podczas wczytywania strony.

<li ng-repeat="a in array"> 
    <a class="button" id="btn" ng-click="function(a)" index="$index" on-load-clicker> 
    {{a.name}} 
    </a> 
</li> 

Prosty dyrektywa, która zajmuje indeks z NG-repeat i wykorzystuje stan zadzwonić pierwszy przycisk w indeksie i kliknij go, gdy strona ładuje.

angular 
    .module("myApp") 
     .directive('onLoadClicker', function ($timeout) { 
      return { 
       restrict: 'A', 
       scope: { 
        index: '=index' 
       }, 
       link: function($scope, iElm) { 
        if ($scope.index == 0) { 
         $timeout(function() { 

          iElm.triggerHandler('click'); 

         }, 0); 
        } 
       } 
      }; 
     }); 

To był jedyny sposób, w jaki mogłem programować automatyczne programowanie w pierwszej kolejności.angular.element(document.querySelector('#btn')).click(); Nie działa z poziomu kontrolera, więc ta prosta dyrektywa wydaje się najbardziej skuteczna, jeśli próbujesz uruchomić kliknięcie na stronie ładowania i możesz określić, który przycisk kliknąć, przechodząc do indeksu. Pomógł mi ten komunikat o przepełnieniu stosu z innego wpisu: https://stackoverflow.com/a/26495541/4684183 Dyrektywa onLoadClicker.

+0

Jeśli zamierzasz zagłosować, wyjaśnij, dlaczego. Nie pomagasz społeczności, będąc negatywnym bez wyjaśnienia. Wysłałem powyższą odpowiedź, ponieważ inne rozwiązania nie działały dla mnie. –

+0

to był prawdopodobnie ktoś, kto próbuje cię żałować. Przytrafia mi się cały czas. przynajmniej mój program zabierze cię z powrotem do 0 \\ _ shrug_ / – activedecay

Powiązane problemy