172

私は AngularJS に比較的慣れていないので、概念を理解していないと思います。Twitter Bootstrap も使用しており、jQuery をロードしました。

ワークフロー: ユーザーがリストからリンクをクリックすると、「マスター」セクションが更新され、ユーザーがクリックしたリンクはアクティブなクラスを取得します。

基本的な HTML マークアップ:

<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>

jQueryでこれを行う:

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

しかし、Angular を使用してサーバーからマスター リスト (JSON 形式) を取得し、ページ上のリストを更新しているため、Angular と jQuery を統合してこれを行う方法がわかりません。

これを統合するにはどうすればよいですか?angularコントローラー関数内に入ると、クリックした要素が見つからないようです

コントローラ:

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

1 に答える 1

283

AngularJS では、次の構文を使用してクリック イベント (およびそのターゲット) を取得できます (関数の$event引数に注意してくださいsetMaster。ドキュメントはこちら: http://docs.angularjs.org/api/ng.directive :ngClick ):

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

これは、この問題を解決するための非常に角度のある方法ではありません。AngularJS では、モデルの操作に重点が置かれています。1 つはモデルを変更し、AngularJS にレンダリングを理解させます。

この問題を解決する AngularJS の方法 (jQuery を使用せず、引数を渡す必要なし$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>

コントローラーのメソッドは次のようになります。

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

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

ここに完全な jsFiddle があります: http://jsfiddle.net/pkozlowski_opensource/WXJ3p/15/

于 2012-09-14T20:01:50.383 に答える