Angularjs'da tıklanan öğeye erişme


173

AngularJS için nispeten yeniyim ve bir kavram kavramadığından şüpheleniyorum. Ayrıca Twitter Bootstrap kullanıyorum ve jQuery yükledim.

İş akışı: Kullanıcı listeden bir bağlantıyı tıklatır, "ana" bölümü güncellenir ve bağlantıyı tıklayan kullanıcı etkin sınıf kazanır.

Temel HTML İşaretlemesi:

<ul class="list-holder" ng-controller="adminController">
   <li><a ng-click="setMaster('client')">Clients</li>
   <li><a ng-click="setMaster('employees')">Employees</li>
   <li><a ng-click="setMaster('etc')>Etc...</li>
</ul>

Bunu jQuery'de yapmak:

jQuery(".list-holder").on('click', 'a', function(event){
    event.preventDefault();
jQuery(".list-holder li").removeClass('active');
jQuery(this).parent('li').addClass('active');
});

Ancak bunu yapmak için Angular ve jQuery nasıl entegre edileceğini anlayamıyorum, çünkü sunucudan ana listeyi (JSON formunda) almak ve sayfadaki bir listeyi güncellemek için Angular kullanıyorum.

Bunu nasıl entegre edebilirim? Açısal denetleyici işlevinin içindeyken tıkladığım öğeyi bulamıyorum

Denetleyici:

function adminController($scope)
    {    
        $scope.setMaster = function(obj)
        {
            // How do I get clicked element's parent li?
            console.log(obj);
        }
    }

Yanıtlar:


283

AngularJS, aşağıdaki sözdizimiyle bir tıklama olayını (ve dolayısıyla bir hedefini) ele geçirmenize izin verirken ( işleve ilişkin $eventargümanı not edin setMaster; buradaki belgeler: http://docs.angularjs.org/api/ng.directive Tıklayın ):

function AdminController($scope) {    
  $scope.setMaster = function(obj, $event){
    console.log($event.target);
  }
}

bu, bu problemi çözmenin çok açısal bir yolu değildir. AngularJS ile odak model manipülasyonudur. Biri bir modeli değiştirir ve AngularJS'nin oluşturmayı anlamasını sağlar.

Bu sorunu çözmenin AngularJS yolu (jQuery kullanmadan ve argümanı geçirmeye gerek kalmadan$event ):

<div ng-controller="AdminController">
    <ul class="list-holder">
        <li ng-repeat="section in sections" ng-class="{active : isSelected(section)}">
            <a ng-click="setMaster(section)">{{section.name}}</a>
        </li>
    </ul>
    <hr>
    {{selected | json}}
</div>

denetleyicideki yöntemler şöyle görünecektir:

$scope.setMaster = function(section) {
    $scope.selected = section;
}

$scope.isSelected = function(section) {
    return $scope.selected === section;
}

Tam jsFiddle: http://jsfiddle.net/pkozlowski_opensource/WXJ3p/15/


198
FYI: $ olayı, işaretlemeden geçmedikçe çalışmaz: ng-click="setMaster(section, $event)"Yalnızca bir uyarı.
Ben Lesh

4
Aslında değil, bu işleve aktarılmalıdır. Ancak gerçekte, kumandanızda bunun gibi dom'a özgü şeylere başvurmak muhtemelen en iyi fikir değildir. Genellikle $ olayı kullanıldığında, bu yayılımı veya benzerlerini durdurma bağlamında yapılır: <a ng-click="doSomething(); $event.stopPropagation()">Click Just Me</a>
Ben Lesh

9
Düğmemde bir simge bulunduğundan $ event.target kullanırken bir sorun yaşadım. Bu nedenle, bazen hedef sonuç düğmedir ve bazen simgedir (tıkladığım yere bağlı olarak). Hedef yerine $ event.currentTarget kullandım ve bir cazibe gibi çalıştı.
Lao

4
Bu şekilde kullanmak $event.target"açısal yol" olmayabilir rağmen ng-repeatbir değişikliği değerlendirmek için bir dinleyici ihtiyacı olan her öğe ile büyük bir liste var gibi hissediyorum değil mi? Bir öğeye tıklamak, listedeki her öğenin yeniden değerlendirilmesi gerektiği anlamına gelir. - $event.targetörneğin bir CSS sınıfını değiştirmek için neden yalnızca bir öğeyi hedeflemiyorsunuz ? Ne düşünüyorsun? Bir Phonegap Uygulaması üzerinde çalışıyorum ve yapabileceğim her performans ayarını sıkıştırmam gerekiyor.
Bradley Flood

13
Bunun $event.currentTargetyerine kullanmanızı da tavsiye ederim $event.target. Ng-click öğesinde alt öğeler varsa, alt öğe tıklandığında $event.targetalt öğe olur. $event.currentTargetöğeyi her zaman belirtilen ng-tıklama ile hedefler.
Gene Parcellano
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.