AngularJS - 不使用 JS/脚本隐藏和显示元素

标签 angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

我有一组标题 ( <h3> ),单击它们时,它们会隐藏/显示相应的部分。

我通过使用 ng-show/ng-hide 实现了这一点然后调用 $scope变量 isInactive/isActive。

我想知道的是,在 $scope.isInactive 中不需要使用 JS 是否可以达到相同的结果?和$scope.isActive和逻辑放置在 HTML 标记中吗?可能与 ng-class 一起使用?

HTML:

<div ng-app="">
  <div ng-controller="EventController">
    <div class="tabs">
         <h3 class="" id="tab-{{$index}}-0"><a id="1" data="{{$index}}" ng-click="switch($event)">1 - 5 Years</a></h3>

         <h3 class="inactive" id="tab-{{$index}}-1"><a id="2" data="{{$index}}" ng-click="switch($event)">6 - 10 Years</a></h3>

         <h3 class="inactive" id="tab-{{$index}}-2"><a id="3" data="{{$index}}" ng-click="switch($event)">11 - 15 Years</a></h3>

         <h3 class="inactive" id="tab-{{$index}}-3"><a id="4" data="{{$index}}" ng-click="switch($event)">16 - 20 Years</a></h3>

        <div class="clear" data="{{$index}}" ng-hide="isInactive('#tab-'+{{$index}} + '-0')">1 - 5 Years Text - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris</div>
        <br>
        <div class="clear" ng-show="isActive('#tab-'+{{$index}} + '-1')">6 - 10 Years Text - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris</div>
        <br>
        <div class="clear" ng-show="isActive('#tab-'+{{$index}} + '-2')">11 - 15 Years Text - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris</div>
        <br>
        <div class="clear" ng-show="isActive('#tab-'+{{$index}} + '-3')">16 - 20 Years Text - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris</div>
    </div>
  </div>
</div>

JS:

function EventController($scope) {

$scope.
switch = function (e) {
    var target = e.target || e.srcElement;
    var elem = angular.element(target);
    var parent = elem.parent();
    var allHeadings = parent.parent().find("h3");

    angular.forEach(allHeadings, function (aHeading) {
        var child = angular.element(aHeading);
        child.addClass("inactive");
    });
    parent.removeClass("inactive");
}

$scope.isInactive = function (e) {
    var elem = angular.element(document.querySelector(e));
    if (elem.hasClass("inactive")) {
        return true;
    } else {
        return false;
    }
};

$scope.isActive = function (e) {
    var elem = angular.element(document.querySelector(e));
    if (elem.hasClass("inactive")) {
        return false;
    } else {
        return true;
    }
};

}

我的jsFiddle:http://jsfiddle.net/oampz/Wr79J/2/

最佳答案

是的,您已经正确地识别出这是使用 ng-class 的合适位置。

仅使用 HTML 和简约 Controller 即可做到:http://jsfiddle.net/Wr79J/4/

JS

function EventController($scope) {
    $scope._activeTab = 1;
}

HTML

<div ng-app="">
    <div ng-controller="EventController">
        <div class="tabs">
             <h3 ng-class="{ 'inactive': _activeTab !== 1, 'active': _activeTab == 1 }">
               <a id="1" ng-click="_activeTab=1">1 - 5 Years</a></h3>

     <!-- .... -->

    <div class="clear" ng-show="_activeTab == 1">
       1 - 5 Years Text - Lorem ipsum ...
    </div>

</div>

注意:我认为您使用的是模板这部分继承的范围中的{{$index}}。我在示例中保持了原样。

虽然这可行,但这段代码不太可维护。您可能希望为选项卡使用更具描述性的名称,而不是 1234

您可以使用 ng-init="_activeTabe = 1" 完全摆脱 Controller 。在容器div上,但这不是ng-init的正确使用。


此外,从 Controller 以任何方式操作 DOM 都不是好的做法(我正在查看代码中的 addClass/removeClass)。如果有必要,那么应该使用指令(例如ng-class)进行操作。

关于AngularJS - 不使用 JS/脚本隐藏和显示元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24011425/

相关文章:

javascript - ng-click 在指令模板内不起作用

javascript - 具有更新内容的 AngularJS 固定列表

angularjs - 获取输入的 ngModelController

javascript - 通过 php 上传 Angular JS 文件——未定义索引 :

angularjs - ng-repeat 用于两个不同数组的用法 - angularjs

javascript - 在 ngRepeat 中更改对象

angularjs - 使用 MVC 数据注释的正则表达式日期时间

javascript - 如何: Angular Factory method declared in a JavaScript object?

javascript - 如何从 ng-repeat 获得合并结果?

javascript - NG-包含 : access child models