访问angularjs中的clicked元素

R D*_*own 172 jquery angularjs

我对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>
Run Code Online (Sandbox Code Playgroud)

在jQuery中执行此操作:

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

但我无法弄清楚如何集成Angular和jQuery来完成这项工作,因为我正在使用Angular从服务器获取主列表(以JSON格式)并更新页面上的列表.

我如何整合这个?一旦我进入角度控制器功能,我似乎无法找到我点击过的元素

控制器:

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

pko*_*rce 282

虽然AngularJS允许您使用以下语法获取单击事件(以及它的目标)(请注意函数的$event参数setMaster;此处的文档:http://docs.angularjs.org/api/ng.directive :ngClick):

function AdminController($scope) {    
  $scope.setMaster = function(obj, $event){
    console.log($event.target);
  }
}
Run Code Online (Sandbox Code Playgroud)

这不是解决这个问题的角度方式.使用AngularJS时,重点是模型操作.一个人会改变模型,让AngularJS弄清楚渲染.

解决这个问题(不使用jQuery和的AngularJS路,而不需要通过$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>
Run Code Online (Sandbox Code Playgroud)

控制器中的方法如下所示:

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

$scope.isSelected = function(section) {
    return $scope.selected === section;
}
Run Code Online (Sandbox Code Playgroud)

这是完整的jsFiddle:http://jsfiddle.net/pkozlowski_opensource/WXJ3p/15/

  • 仅供参考:$ event除非在标记中传递,否则不起作用:`ng-click ="setMaster(section,$ event)"`只是一个抬头. (198认同)
  • 我还建议使用`$ event.currentTarget`而不是`$ event.target`.如果带有ng-click的元素具有子元素,则单击子元素时,`$ event.target`将成为子元素.`$ event.currentTarget`将始终以指定的ng-click为目标. (13认同)
  • 我在使用$ event.target时遇到了问题,因为我的按钮里面有一个图标.因此,有时目标结果是按钮,有时是图标(取决于我点击的位置).我使用了$ event.currentTarget而不是target,它就像魅力一样. (9认同)
  • 不是真的,它必须传递给函数.但实际上,在控制器中引用像这样的dom特定的东西可能不是最好的主意.通常在使用$ event时,它是在停止传播等的情况下:`<ng-click="doSomething(); $ event.stopPropagation()"> Click Just Me </a> (4认同)
  • 虽然像这样使用`$ event.target`可能不是"有角度的方式"我觉得有一个大的'ng-repeat`列表,每个需要听众评估变化的项目效率不高?单击一个元素是否意味着必须重新评估整个列表中的每个项目? - 为什么不直接用`$ event.target`来定位一个项来切换CSS类.你怎么看?我正在开发一个Phonegap应用程序,需要尽可能地调整每一个性能调整. (4认同)