【问题标题】:Angular-UI Tabs: add class to a specific tabAngular-UI 选项卡:将类添加到特定选项卡
【发布时间】:2019-09-08 03:04:26
【问题描述】:

我想使用 Angular UI 创建以下选项卡:


(来源:gyazo.com

所以,我正在添加基于 Bootstap 的类名/标记的样式:

.nav-tabs > li.new > a {
  padding-top: 5px;
}
.nav-tabs > .new > a:after {
  content: "NEW";
  color: indianred;
  font-size: 10px;
  vertical-align: super;
  padding-left: 2px;
}

(如您所见,我需要在添加超级脚本文本后稍微补偿<a> 上的填充,否则它会被下推。)

接下来,我在html/js 文件中有以下标记和代码:

HTML:
<tabset>
    <tab ng-repeat="tab in tabs" heading="{{ tab.title }}" active="tab.active" ><!-- ng-class="{new: tab.new}"-->
        <div ng-include="tab.page"></div>
    </tab>
</tabset>

JS:
var TabsDemoCtrl = function ($scope) {
  $scope.tabs = [
    { title:"Tab 1", content:"Dynamic content 1" },
    { title:"Tab 2", content:"Dynamic content 2", active: true, 'new': true }
  ];

};

所以,剩下的就是让 Angular 根据上面的 tabs 数组定义在正确的元素上添加一个名为 "new" 的类。不幸的是,我没弄清楚怎么做。

如您所见,我尝试了 ng-class="{new: tab.new}"(在 html 代码中注释),但这基本上破坏了所有类功能,在开发工具中查看时会产生不正确的 ng-class 属性:

ng-class="{new: tab.new} {active: active, disabled: disabled}"

这是Plunkr

【问题讨论】:

    标签: twitter-bootstrap angularjs tabs angular-ui classname


    【解决方案1】:

    我不确定您是否可以将 ng-class 应用于这样的选项卡。在尝试并失败后,我决定查看选项卡的 bootstrap-ui 源代码,并发现了一个与选项卡标题属性相关的有趣发现。显然,如果您将选项卡标题作为子元素放置在选项卡元素中,则可以将 html 放在标题部分。

    查看here 中的tabheading 指令。

    这是他们展示的例子:

    <tabset>
      <tab>
        <tab-heading><b>HTML</b> in my titles?!</tab-heading>
        And some content, too!
      </tab>
      <tab>
        <tab-heading><i class="icon-heart"></i> Icon heading?!?</tab-heading>
        That's right.
      </tab>
    </tabset>
    

    在你的情况下,我认为你可以做这样的事情来获得同样的效果:

    <tab ng-repeat="tab in tabs" active="tab.active">
        <tab-heading>{{tab.title}} <span ng-show="tab.new">new</span></tab-heading>
        <div ng-include="tab.page"></div>
    </tab>
    

    【讨论】:

    • 感谢您指出正确的方向。但 KayakDave 的回答确实完成了这项工作。
    【解决方案2】:

    @TyndieRock 是对的,据我所知,您不能将类应用于 bootstrap-ui 选项卡。任何 ng-class 都会被剥离,直接添加一个类会导致不良行为,它会阻止任何注入它的尝试。

    我确实在 github 上看到了一个要求自定义 CSS 支持的问题。所以也许有一天。

    @TyndieRock 的解决方案让您更接近,但不会让您一路走好。感谢您找到tab-heading。虽然他的语法只是略有偏差。

    这就是我认为你想要的:

     <tabset>
        <tab ng-repeat="tab in tabs">
        <tab-heading ng-class="{new:tab.new}">{{tab.title}}</tab-heading>
            <div ng-include="tab.page"></div>
        </tab>
    </tabset>
    

    这将使文本样式化。但它不适用于您的 css 内容。

    您可能想要创建自己的自定义标签。这很麻烦,但这会给你你正在寻找的控制。

    【讨论】:

    • 可以设置生成的 li 和 a 标签的样式,但不能使用 ng-class。查看我的解决方案stackoverflow.com/a/21092713/968833
    • @stride 很好的一点是,新的三元运算符有效——注意三元运算符已添加到 Angular 1.1.5。这个问题是在那之前写的 - 1.0.8 - 所以这不是一个选择。
    【解决方案3】:

    这个问题让我发疯了,所以这就是我为自定义标签标题样式所做的事情。 适用于 Angular >= 1.1.5,因为它是唯一在表达式中具有三元运算符的版本。

    需要定位&lt;tab&gt; 元素而不是标签标题。不幸的是,ng-class 将无法工作,并且会与模板中的其他 ng-class 指令混淆。

    如果您尝试定位选项卡标题元素,您会发现您无能为力。 CSS 中没有父选择器,因此无法到达大部分操作正在进行的锚标记。

    所以要吃饼干: 1) 让您的样式以引导选项卡指令生成的降序锚标记为目标

    2) 使用这种晦涩的语法应用类:

     <tabset>
            <tab class="{{orderForm.detailsForm.$invalid ? 'invalid-tab' : 'valid-tab'}}">
                <div>CONTENT</div>
    </tab>
    </tabset>
    

    然后一切都按预期工作,并将适当的类添加到 &lt;li&gt;,它是有趣的 &lt;a&gt; 标记的父级。

    总结一下: 当 ng-class 行为不端并存在插值问题时,请尝试更直接。

    希望对某人有所帮助。

    【讨论】:

    • 这是可行的,但我认为标签应该支持 ng-class :-D。
    • 如果我们只有 invalid-tab 类怎么办?我们可以在第二种情况下使用 '' 吗?
    • 你有valid-tab css吗?
    【解决方案4】:

    我今天遇到了同样的问题,并以一种有点 hacky 的方式解决了它。每当我确定一个特定的选项卡需要添加/删除一个类时,我只需使用角度选择器来选择我的选项卡,然后手动动态添加/删除类。

    HTML
    <tab class="errorTab" heading='error' active='explorer.hasError'>
      <div error-message class='errorTabSectionOuter'></div>
    </tab>
    
    JS
    var errorTab = angular.element('.errorTab');
    if($scope.explorer.hasError){
      errorTab.addClass('showErrorTabClass');
      errorTab.removeClass('hideErrorTabClass');
    }
    else{
      errorTab.addClass('hideErrorTabClass');
      errorTab.removeClass('showErrorTabClass');
    }
    

    【讨论】:

    • 这是一个指令,而不是把它放在控制器中,因为你正在做的 DOM-Selection 不应该是你的视图控制器的一部分。
    【解决方案5】:

    尝试在选项卡周围的 DIV 中添加一个 id,然后根据它制作您的样式。 例如

    <div id="myTabs">
     <tabset>.....</tabset>
    </div>
    

    这是一种使活动标签具有不同颜色的样式

    #myTabs div li.active a {
      background-color: lightsteelblue;
    }
    

    【讨论】:

    • 这不适合这个问题,因为他希望将一个类应用于选项卡标题以在类匹配时显示新。您只是将现有类用于活动选项卡,但这不是问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多