【问题标题】:Accessing clicked element in angularjs在angularjs中访问单击的元素
【发布时间】:2012-09-07 23:46:30
【问题描述】:

我对 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 和 jQuery 来完成这项工作,因为我使用 Angular 从服务器获取主列表(以 JSON 形式)并更新页面上的列表。

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

控制器:

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

【问题讨论】:

    标签: jquery angularjs


    【解决方案1】:

    虽然 AngularJS 允许您使用以下语法(注意 setMaster 函数的 $event 参数;此处的文档:http://docs.angularjs.org/api/ng.directive:ngClick)来处理点击事件(并因此成为它的目标):

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

    这不是解决这个问题的非常有角度的方式。 AngularJS 的重点是模型操作。可以改变一个模型,让 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/

    【讨论】:

    • 仅供参考:$event 不起作用,除非它在标记中传递:ng-click="setMaster(section, $event)" 只是提醒一下。
    • 不是真的,它必须传递给函数。但实际上,在控制器中引用此类特定于 dom 的内容可能不是最好的主意。一般在使用$event的时候,是在停止传播之类的上下文中:&lt;a ng-click="doSomething(); $event.stopPropagation()"&gt;Click Just Me&lt;/a&gt;
    • 我在使用 $event.target 时遇到了问题,因为我的按钮中有一个图标。所以,有时目标结果是按钮,有时是图标(取决于我点击的位置)。我使用了 $event.currentTarget 而不是 target,它就像一个魅力。
    • 虽然像这样使用$event.target 可能不是“有角度的方式”,但我觉得拥有一个大的ng-repeat 列表,每个项目都需要一个听众来评估更改效率不高?单击一个元素意味着必须重新评估整个列表中的每个项目,对吗? -- 例如,为什么不只使用$event.target 来定位那个项目来切换CSS 类。你怎么看?我正在开发一个 Phonegap 应用程序,需要尽我所能进行所有性能调整。
    • 我还想推荐使用$event.currentTarget 而不是$event.target。如果带有ng-click的元素有子元素,如果子元素被点击$event.target成为子元素。 $event.currentTarget 将始终以指定的 ng-click 为目标。
    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 2012-08-21
    • 1970-01-01
    • 2015-01-25
    • 2017-10-14
    • 2015-03-06
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多