【问题标题】:AngularJS: how do I show ellipses using limitTo filter only when a string exceeds the limitAngularJS:如何仅在字符串超过限制时才使用limitTo过滤器显示省略号
【发布时间】:2016-11-20 13:30:36
【问题描述】:

我正在对某些字符串使用 limitTo 过滤器。如果字符串少于 10 个字符,则字符串按原样显示。如果字符串长于 10 个字符,我想在第十个字符处截断字符串后显示省略号。这样做有角度捷径吗?谢谢

例如:

{{main.title | limitTo:10}}

如果 main.title = "A Good Day",输出将是:A Good Day

如果 main.title = "A Terrible Day",输出将是:A Terrible...

【问题讨论】:

    标签: angularjs string filter


    【解决方案1】:

    希望这会有所帮助:

    {{ main.title | limitTo: 10 }}{{main.title.length > 10 ? '...' : ''}}
    

    【讨论】:

    • 我更喜欢这个答案,而不是使用另一个带有 ng-if 的跨度,谢谢
    • 这很快,易于理解,并且完美地满足了我的需要。
    • 我建议使用 HTML 省略号:…
    【解决方案2】:

    好吧,如果你愿意,你可以为此构建一个过滤器,但我会使用ngIf 指令,如下所示:

    (function() {
      'use strict';
    
      angular.module('app', [])
        .controller('mainCtrl', function() {
          var vm = this;
    
          vm.text = 'Really longer than 10';
        });
    })();
    <!DOCTYPE html>
    <html ng-app="app">
    
    <head>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.7/angular.min.js"></script>
    </head>
    
    <body ng-controller="mainCtrl as ctrl">
      Without limit: <span ng-bind="ctrl.text"></span>
      <hr>
      With limit: <span ng-bind="ctrl.text | limitTo:10"></span>
      <span ng-if="ctrl.text.length > 10">...</span>
    </body>
    
    </html>

    【讨论】:

    • 太棒了。谢谢你的帮助。答案很明显,但它超越了我。
    【解决方案3】:

    根据limitTo 编写您自己的过滤器是最好的方法。

    angular.module('your-module-name').filter('dotsFilter', [
        '$filter',
        function ($filter) {
            /**
             * Shorten the input and add dots if it's needed
             * @param {string} input 
             * @param {number} limit
             */
            function dotsFilter(input, limit) {
                var newContent = $filter('limitTo')(input, limit);
                if(newContent.length < input.length) { newContent += '...'; }
                return newContent;
            }
    
            return dotsFilter;
        }
    ]);
    

    在视图中使用:

    {{ model.longTextData | dotsFilter:10 }}
    

    【讨论】:

      【解决方案4】:

      使用&lt;span ng-class="{'ellipsis': text.length &gt; limit}"&gt;{{text | limitTo:limit}}&lt;/span&gt;

      你需要定义一个css类.ellipsis:after{ content: '...'; }和一个作用域变量limit

      {{ text.length > limit ? ((text | limitTo:limit) + "...") : text }}
      

      (function() {
            "use strict";
            angular.module('app', [])
              .controller('mainCtrl', function($scope) {
                $scope.text = "Hello World";
                $scope.limit = 10;
              });
          })();
      .ellipsis:after{ content: '...'; }
      <!DOCTYPE html>
          <html ng-app="app">
      
          <head>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
          </head>
      
          <body ng-controller="mainCtrl">
            <h3>Using Option1</h3>
            <span ng-class="{'ellipsis': text.length > limit}">{{ text | limitTo:limit }}</span>
            <br>
            <h3>Using Option2</h3>
            <span>{{ text.length > limit ? ((text | limitTo:limit) + "...") : text }}</span>
          </body>
      
          </html>

      【讨论】:

      • 这很好很简单,你可以做limitTo:limit-3,不像BeingSuman的答案,它可能会为单个字符添加省略号。
      【解决方案5】:

      由于已经发布了使用 angularjs 的其他答案,我将给你一个简单的 css 技术来做到这一点。

         (function() {
            "use strict";
            angular.module('app', [])
              .controller('mainCtrl', function($scope) {
                $scope.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book";
              });
          })();
      span.ellipsis {
          display:inline-block;
          width:180px;
          white-space: nowrap;
          overflow:hidden;
          text-overflow: ellipsis;
      }
          <!DOCTYPE html>
          <html ng-app="app">
      
          <head>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
          </head>
      
          <body ng-controller="mainCtrl">
            <span ng:class="{true:'ellipsis', false:''}[text.length>=10]" style="max-width: 10ch;">{{text}}</span>
          </body>
      
          </html>

      【讨论】:

      • 你是如何限制字符数的?
      • 我已经根据要求更新了我的答案,请看看它是否适合你
      • span.ellipsis:after { content: '...' }
      • 你不应该需要内联块(这只是因为它是一个跨度,所以内联而不是内联块)并且通常不需要 !important
      【解决方案6】:

      以后阅读的人可能会考虑使用 CSS 而不是 JS。比如:

      .ellipsis {
          white-space: nowrap;
          overflow: hidden;
          text-overflow: ellipsis;
      }
      

      【讨论】:

      • 我同意这是最好的解决方案:) 不需要使用JS的地方最好不要使用
      【解决方案7】:
      <div maxlength="59"> 
        {{row.RequestTitle.length > 59 ? row.RequestTitle.substr(0,59) + '...' : row.RequestTitle}} 
      </div>
      

      这很有用,也可以运行,Angular 5 Material UI

      【讨论】:

      • 请将代码块缩进 4 个空格,而不是使用粗体格式。代码块(包含 4 个空格或内联反引号的完整代码块)也允许 HTML 标记而不将它们格式化为帖子的一部分。
      【解决方案8】:

      如果有人想在控制器中使用省略号逻辑,那么下面的代码 sn-p 会有所帮助:

      $filter('limitTo')(input, limit) + (input.length > limit ? '&hellip;' : '');
      

      其中inputlimit 将是“输入字符串”和数值限制值,例如

      $filter('limitTo')(stringText, 20) + (stringText.length > 20 ? '&hellip;' : '');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 2021-05-19
        • 2018-12-28
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        相关资源
        最近更新 更多