Angularjs 显示/隐藏和交替样式

Posted

技术标签:

【中文标题】Angularjs 显示/隐藏和交替样式【英文标题】:Angularjs show/hide and alternating styles 【发布时间】:2013-12-07 16:24:02 【问题描述】:

我有一个显示产品信息的 div 列表。核心信息是相同的,但某些字段仅针对某些产品类型显示或隐藏(通过 ng-show/ng-hide)。这很好用,但我们希望以交替样式(斑马条纹)显示行以提高可读性。怎么能做到这一点,因为如果我隐藏一行,我们最终会得到两行具有相同样式的行? html 的格式为:

    <div style="alt-1">
       <div class="col-md-3 list-item-odd">Location</div>
       <div class="col-md-9 list-item-odd" > location </div>
   </div>

   <div ng-show="itemType == 1" style="alt-2">
      <div class="col-md-3 list-item-odd">Layout Type</div>
      <div class="col-md-9 list-item-odd" > layoutType</div>
   </div>

   <div style="alt-1">
      <div class="col-md-3 list-item-odd">Category</div>
      <div class="col-md-9 list-item-odd" > category </div>
  </div>

如本例所示,如果 itemType != 1 我们以两个相邻的行结束,样式为“alt-1”。

我的一个想法是在 ng-show(或 ng-hide)完成后编写一个优先级较低的指令(以下示例中的替代样式)来遍历 DIV。

<div class="enclosing" alternate-styles>

       HTML from above

</div>

但是,有两件事困扰着我。一,行不通。我总是对 Angular 中的某些东西感到惊讶。第二,我有一种挥之不去的怀疑,即我让我的 jQuery 经验让我对明显的 Angular 解决方案视而不见。

意见和/或建议?

谢谢,

杰瑞

【问题讨论】:

你能使用 ng-repeat 和docs.angularjs.org/api/ng.directive:ngClassEven吗? 我想过,但是我必须创建大量字段和提示,然后动态填写表单的每个部分。这是一种选择,但我不喜欢使用它,因为它与应用程序中的所有其他布局不同。 【参考方案1】:

如果您使用的是 Angular 1.2,那么您可以使用 ng-if 代替 ng-show/ng-hide 从 DOM 中完全删除元素。

【讨论】:

【参考方案2】:

因为我是 Angular 新手,所以让指令生效对我来说有点挑战。在自定义指令之后(之后),我一直在与 ng-show 战斗。 我确实找到了这个blog,这解释了为什么 ng-show 有我遇到的行为。 这是自定义指令和控制器的java脚本sn-p

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) 

  $scope.location = 'location here';
  $scope.layoutType = 'layoutType here';
  $scope.category = "category here"
  $scope.itemType = 2;
  $scope.alternateStyle = 0;
);
app.directive("alternateStyle", ['$timeout',
  function($timeout) 

    return 
      restrict: 'A',

      link: function(scope, element, attrs) 
        scope.$watch('itemType', function(newVal) 
          $timeout(function() 
            if (!element.hasClass('ng-hide'))
              scope.alternateStyle++;
            if (scope.alternateStyle % 2) 
              element.removeClass('alt-1').addClass('alt-2')
             else 
              element.removeClass('alt-2').addClass('alt-1')
            
          );
        );
      
    ;
  
]);

这是工作的sample on Plunker

希望对你有帮助。

【讨论】:

谢谢。这正是我所需要的。我理解的关键是检测 ng-hide。

以上是关于Angularjs 显示/隐藏和交替样式的主要内容,如果未能解决你的问题,请参考以下文章

jQuery动画(显示隐藏,淡入淡出,滑动)

angularjs2 ng2 密码隐藏显示

当我们使用 JavaScript 隐藏/显示时清除下拉列表和/或文本框内容当它们被交替选择时

jquery detach 重新显示 div 内容时遇到问题

AngularJS API

在angularjs中显示和隐藏表格行