AngularJSで文字列の長さを制限する


225

私は以下を持っています:

<div>{{modal.title}}</div>

文字列の長さを20文字に制限する方法はありますか?

そしてさらに良い質問は、文字列...が20文字を超える場合に、切り捨てて最後に表示するように文字列を変更できる方法があるかどうかです。


回答:


344

編集AngularJSオファーフィルター の最新バージョンlimitTo

次のようなカスタムフィルターが必要です。

angular.module('ng').filter('cut', function () {
        return function (value, wordwise, max, tail) {
            if (!value) return '';

            max = parseInt(max, 10);
            if (!max) return value;
            if (value.length <= max) return value;

            value = value.substr(0, max);
            if (wordwise) {
                var lastspace = value.lastIndexOf(' ');
                if (lastspace !== -1) {
                  //Also remove . and , so its gives a cleaner result.
                  if (value.charAt(lastspace-1) === '.' || value.charAt(lastspace-1) === ',') {
                    lastspace = lastspace - 1;
                  }
                  value = value.substr(0, lastspace);
                }
            }

            return value + (tail || ' …');
        };
    });

使用法:

{{some_text | cut:true:100:' ...'}}

オプション:

  • wordwise(boolean)-trueの場合、単語の境界のみでカットし、
  • max(整数)-テキストの最大長、この文字数にカット、
  • tail(文字列、デフォルト: '…')-文字列が切り取られた場合、この文字列を入力文字列に追加します。

別の解決策http : //ngmodules.org/modules/angularjs-truncate(by @Ehvince)


2
angular-modulesに同等のものがあります:ngmodules.org/modules/angularjs-truncate
Ehvince

angularjs-truncateはソリューションではありませんが、あなたのISソリューションです。ありがとうございました!モジュールにしてください!
アントン・ベソノフ2014

@epokkユーザーが3つのドットをクリックした後、完全なカットされていないテキストを表示できるようにする方法はありますか?「もっと見る」のような?ありがとう!
Thales P

これは、{{post.post_content | cut:true:100: '...'}}ただし、次のように使用すると失敗します<span ng-bind-html = "trustedHtml(post.post_content | cut:true:100: '...')"> < / span>私の場合、信頼できるhtmlで使用することを余儀なくされるため
S Vinesh

ワード単位の制限は、デフォルトの "limitTo"には存在しないように見える優れた機能です
pdizz

496

CSSなしの簡単な1行の修正を次に示します。

{{ myString | limitTo: 20 }}{{myString.length > 20 ? '...' : ''}}

79
シンプルでエレガント。代わりに'...':あなたはまた、省略記号のためのHTMLエンティティを使用することができます'&hellip;'
トム・ハリソン

おそらく最も痛みのないソリューションです。ただし、フィルターは比較的重いため、巨大なng-repeatリストでパフォーマンスの問題が発生する可能性があることに注意してください。:)
カウワンド2016

1
驚くばかり!複数の文字の後ではなく、複数の行の後にカットする方法はありますか?
axd 2016年

@axdあなたはそれをCSSで試すか、それを達成するためのディレクティブを書く必要があります。
Govan 2016年

1
これが最良の答えです。パフォーマンスへの影響は、妥当な数のng-repeatで無視できるはずです。切り捨てが必要なコンテンツを含む数百のng-repeatを取り戻す場合は、製図板に戻る必要があるかもしれません。@Govan
erier

59

私はこれが遅いことを知っていますが、最新バージョンのangularjs(私は1.2.16を使用しています)では、limitToフィルターは文字列と配列をサポートしているため、次のように文字列の長さを制限できます。

{{ "My String Is Too Long" | limitTo: 9 }}

出力されます:

My String

9
このソリューションには「...」がありません。結果は次のようになります。「私の文字列...」
Snæbjørn

ここに省略記号が表示されません:plnkr.co/edit/HyAejS2DY781bqcT0RgV?p=preview。詳しく説明できますか?
スリムな

2
@Snæbjørnが言っていることは、質問をした人は切り詰められた文字列の最後に「...」を挿入するソリューションを好んだということです。ゴーバンの答えはそれを行います。
Nahn

@Nahn指摘してくれてありがとう。私はおそらく別の答えの代わりにEpokKの答えにコメントをするべきでした。
スリムな

52

単純にcssクラスをdivに追加し、angularjsを介してツールチップを追加して、トリミングされたテキストがマウスオーバーで表示されるようにすることができます。

<div class="trim-info" tooltip="{{modal.title}}">{{modal.title}}</div>

   .trim-info {
      max-width: 50px;
      display: inline-block;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;  
      line-height: 15px;
      position: relative;
   }

4
text-overflow:省略記号、いいもの。
Chris Russo

4
このテクニックは素晴らしいですが、テキストの折り返しを防ぎます
Larry

これが正解です。私の一般的なルールは、「CSSで実行できることをJavaScriptで行わないこと」です。
2015年

4
これは、段落ごとに1行のテキストに対してのみ機能します。複数行のcss-tricks.com/line-clampinを参照してください(すべてのブラウザーでサポートされているわけではありません)。
ロバート

これは、配列の長さを制限しようとしている場合にも機能しますng-repeat
ちゃけだ

27

私は同様の問題がありました、これが私がしたことです:

{{ longString | limitTo: 20 }} {{longString.length < 20 ? '' : '...'}}

改行を避けるために、両方の出力間の空白を削除します
Ignacio Vazquez

21
< div >{{modal.title | limitTo:20}}...< / div>

最もシンプルなアプローチでありながら機能的です。ただし、すべてのタイトルが20文字を超えると想定されており、これは場合によっては予期しないものになることがあります。
Henrique M.

18

よりエレガントなソリューション:

HTML:

<html ng-app="phoneCat">
  <body>
    {{ "AngularJS string limit example" | strLimit: 20 }}
  </body>
</html>

角度コード:

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

 phoneCat.filter('strLimit', ['$filter', function($filter) {
   return function(input, limit) {
      if (! input) return;
      if (input.length <= limit) {
          return input;
      }

      return $filter('limitTo')(input, limit) + '...';
   };
}]);

デモ:

http://code-chunk.com/chunks/547bfb3f15aa1/str-limit-implementation-for-angularjs


input値が動的な場合にリターンを追加することを提案できますか?つまりif (!input) {return;}、JSコンソールエラーが発生します
mcranston18

1
@ mcranston18が追加されました。ありがとうございました。
Anam 2015年

15

文字列の長さが制限を超えている場合にのみ省略記号が必要なためng-if、バインディングよりも省略記号を追加する方が適切と思われます。

{{ longString | limitTo: 20 }}<span ng-if="longString.length > 20">&hellip;</span>

7

オプションがあります

.text {
            max-width: 140px;
            white-space: nowrap;
            overflow: hidden;
            padding: 5px;
            text-overflow: ellipsis;(...)
        }
<div class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Excepturi qui soluta labore! Facere nisi aperiam sequi dolores voluptatum delectus vel vero animi, commodi harum molestias deleniti, quasi nesciunt. Distinctio veniam minus ut vero rerum debitis placeat veritatis doloremque laborum optio, nemo quibusdam ad, sed cum quas maxime hic enim sint at quos cupiditate qui eius quam tempora. Ab sint in sunt consequuntur assumenda ratione voluptates dicta dolor aliquid at esse quaerat ea, veritatis reiciendis, labore repellendus rem optio debitis illum! Eos dignissimos, atque possimus, voluptatibus similique error. Perferendis error doloribus harum enim dolorem, suscipit unde vel, totam in quia mollitia.</div>


7

文字列の長さを制限するために私が見つけた最も簡単な解決策{{ modal.title | slice:0:20 }}であり、上記の@Govanから借りることで{{ modal.title.length > 20 ? '...' : ''}}、文字列が20を超える場合にサスペンションポイントを追加できるため、最終的な結果は単純です。

{{ modal.title | slice:0:20 }}{{ modal.title.length > 20 ? '...' : ''}}

https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html


4

これは、テキストを切り捨てるためのカスタムフィルターです。EpokKのソリューションに触発されましたが、私のニーズと好みに合わせて変更されました。

angular.module('app').filter('truncate', function () {

    return function (content, maxCharacters) {

        if (content == null) return "";

        content = "" + content;

        content = content.trim();

        if (content.length <= maxCharacters) return content;

        content = content.substring(0, maxCharacters);

        var lastSpace = content.lastIndexOf(" ");

        if (lastSpace > -1) content = content.substr(0, lastSpace);

        return content + '...';
    };
});

そして、これがユニットテストですので、それがどのように振る舞うべきかを見ることができます:

describe('truncate filter', function () {

    var truncate,
        unfiltered = " one two three four ";

    beforeEach(function () {

        module('app');

        inject(function ($filter) {

            truncate = $filter('truncate');
        });
    });

    it('should be defined', function () {

        expect(truncate).to.be.ok;
    });

    it('should return an object', function () {

        expect(truncate(unfiltered, 0)).to.be.ok;
    });

    it('should remove leading and trailing whitespace', function () {

        expect(truncate(unfiltered, 100)).to.equal("one two three four");
    });

    it('should truncate to length and add an ellipsis', function () {

        expect(truncate(unfiltered, 3)).to.equal("one...");
    });

    it('should round to word boundaries', function () {

        expect(truncate(unfiltered, 10)).to.equal("one two...");
    });

    it('should split a word to avoid returning an empty string', function () {

        expect(truncate(unfiltered, 2)).to.equal("on...");
    });

    it('should tolerate non string inputs', function () {

        expect(truncate(434578932, 4)).to.equal("4345...");
    });

    it('should tolerate falsey inputs', function () {

        expect(truncate(0, 4)).to.equal("0");

        expect(truncate(false, 4)).to.equal("fals...");
    });
});

3

フィルターを使用して、文字列または配列の長さを制限できます。AngularJSチームによって書かれたこれをチェックしてください。


さらにいくつかの詳細も提供します
Parixit

3

htmlでは、次のよう angular自体によって提供されるlimitToフィルターとともに使用されます

    <p> {{limitTo:30 | keepDots }} </p>

フィルターkeepDots:

     App.filter('keepDots' , keepDots)

       function keepDots() {

        return function(input,scope) {
            if(!input) return;

             if(input.length > 20)
                return input+'...';
            else
                return input;

        }


    }

3

次のようなものが必要な場合: InputString => StringPart1 ... StringPart2

HTML:

<html ng-app="myApp">
  <body>
    {{ "AngularJS string limit example" | strLimit: 10 : 20 }}
  </body>
</html>

角度コード:

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

 myApp.filter('strLimit', ['$filter', function($filter) {
   return function(input, beginlimit, endlimit) {
      if (! input) return;
      if (input.length <= beginlimit + endlimit) {
          return input;
      }

      return $filter('limitTo')(input, beginlimit) + '...' + $filter('limitTo')(input, -endlimit) ;
   };
}]);

次のパラメータの例:
beginLimit = 10
endLimit = 20

:- /home/house/room/etc/ava_B0363852D549079E3720DF6680E17036.jar
:- /home/hous...3720DF6680E17036.jar


2
Use this in your html - {{value | limitTocustom:30 }}

and write this custom filter in your angular file,

app.filter('limitTocustom', function() {
    'use strict';
    return function(input, limit) {
        if (input) {
            if (limit > input.length) {
                return input.slice(0, limit);
            } else {
                return input.slice(0, limit) + '...';
            }
        }
    };
});

// if you initiate app name by variable app. eg: var app = angular.module('appname',[])

2

これはスクリプトの最後からのものではない可能性がありますが、以下のcssを使用してこのクラスをdivに追加できます。これにより、テキストが切り捨てられ、マウスオーバー時にテキスト全体が表示されます。あなたはより多くのテキストを追加し、角度クリックハドラーを追加して、CLIでDIVのクラスを変更することができます

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

    .ellipseContent:hover {
        overflow: visible;
        white-space: normal;
    }

2

あなたは、2つのバインディングを持っている場合{{item.name}}{{item.directory}}

また、ディレクトリとして「/ root」、名前として「Machine」(/ root-machine)を想定して、データをディレクトリの後に名前を付けて表示したいとします。

{{[item.directory]+[isLast ? '': '/'] + [ item.name]  | limitTo:5}}

この回答を間違った質問に投稿した可能性はありますか?これは、AngularJSで文字列の長さを制限することとは関係がないようです。
BSMP 2017

1

このnpmモジュールを使用できます:https : //github.com/sparkalow/angular-truncate

次のように、切り捨てフィルターをアプリモジュールに挿入します。

var myApp = angular.module('myApp', ['truncate']); 

この方法でアプリにフィルターを適用します。

{{ text | characters:20 }} 


0

これを簡単に実行するこのディレクティブを作成し、文字列を指定された制限に切り捨てて、「表示数を増やす/減らす」トグルを追加しました。GitHubで見つけることができます:https : //github.com/doukasd/AngularJS-Components

次のように使用できます。

<p data-dd-collapse-text="100">{{veryLongText}}</p>

ディレクティブは次のとおりです。

// a directive to auto-collapse long text
app.directive('ddCollapseText', ['$compile', function($compile) {
return {
    restrict: 'A',
    replace: true,
    link: function(scope, element, attrs) {

        // start collapsed
        scope.collapsed = false;

        // create the function to toggle the collapse
        scope.toggle = function() {
            scope.collapsed = !scope.collapsed;
        };

        // get the value of the dd-collapse-text attribute
        attrs.$observe('ddCollapseText', function(maxLength) {
            // get the contents of the element
            var text = element.text();

            if (text.length > maxLength) {
                // split the text in two parts, the first always showing
                var firstPart = String(text).substring(0, maxLength);
                var secondPart = String(text).substring(maxLength, text.length);

                // create some new html elements to hold the separate info
                var firstSpan = $compile('<span>' + firstPart + '</span>')(scope);
                var secondSpan = $compile('<span ng-if="collapsed">' + secondPart + '</span>')(scope);
                var moreIndicatorSpan = $compile('<span ng-if="!collapsed">...</span>')(scope);
                var toggleButton = $compile('<span class="collapse-text-toggle" ng-click="toggle()">{{collapsed ? "less" : "more"}}</span>')(scope);

                // remove the current contents of the element
                // and add the new ones we created
                element.empty();
                element.append(firstSpan);
                element.append(secondSpan);
                element.append(moreIndicatorSpan);
                element.append(toggleButton);
            }
        });
    }
};
}]);

そしてそれに伴うCSS:

.collapse-text-toggle {
font-size: 0.9em;
color: #666666;
cursor: pointer;
}
.collapse-text-toggle:hover {
color: #222222;
}
.collapse-text-toggle:before {
content: '\00a0(';
}
.collapse-text-toggle:after {
content: ')';
}

0

このソリューションは純粋にngを使用しています、HTMLでタグをしています。

解決策は、最後に「もっと見る...」リンクを使用して表示される長いテキストを制限することです。ユーザーが[もっと見る...]リンクをクリックすると、残りのテキストが表示され、[もっと見る...]リンクが削除されます。

HTML:

<div ng-init="limitText=160">
   <p>{{ veryLongText | limitTo: limitText }} 
       <a href="javascript:void(0)" 
           ng-hide="veryLongText.length < limitText" 
           ng-click="limitText = veryLongText.length + 1" > show more..
       </a>
   </p>
</div>

0

最も簡単なソリューション->私は、マテリアルデザイン(1.0.0-rc4)に作業を任せることを見つけました。md-input-containerあなたのための作業を行います。文字列を連結し、省略記号を追加します。さらに、クリックしてテキスト全体を取得できるため、エンチラーダ全体になります。の幅を設定する必要がある場合がありmd-input-containerます。

HTML:

<md-input-container>
   <md-select id="concat-title" placeholder="{{mytext}}" ng-model="mytext" aria-label="label">
      <md-option ng-selected="mytext" >{{mytext}}
      </md-option>
   </md-select>
</md-input-container>

CS:

#concat-title .md-select-value .md-select-icon{
   display: none; //if you want to show chevron remove this
}
#concat-title .md-select-value{
   border-bottom: none; //if you want to show underline remove this
}

0

カスタムAngularフィルターで単語数を制限する:これ は、Angularフィルターを使用して、カスタムフィルターを使用して表示される単語数を制限する方法です。

HTML:

<span>{{dataModelObject.TextValue | limitWordsTo: 38}} ......</span>

Angular / Javascriptコード

angular.module('app')
.filter('limitWordsTo', function () {
    return function (stringData, numberOfWords) {
        //Get array of words (determined by spaces between words)
        var arrayOfWords = stringData.split(" ");

        //Get loop limit
        var loopLimit = numberOfWords > arrayOfWords.length ? arrayOfWords.length : numberOfWords;

        //Create variables to hold limited word string and array iterator
        var limitedString = '', i;
        //Create limited string bounded by limit passed in
        for (i = 0; i < loopLimit; i++) {
            if (i === 0) {
                limitedString = arrayOfWords[i];
            } else {
                limitedString = limitedString + ' ' + arrayOfWords[i];
            }
        }
        return limitedString;
    }; 
}); //End filter

0

私にとっては問題なく動作します 'スパン内'、ng-show = "MyCtrl.value。$ viewValue.length> your_limit" ...続きを読む。「終了スパン」


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.