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 솔루션입니다. 감사합니다! 모듈로 만드십시오!
Anton Bessonov

@epokk 사용자가 세 개의 점을 클릭 한 후 완전한 자르지 않은 텍스트를 표시 할 수있는 방법이 있습니까? "더보기"처럼? 감사!
탈레스 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가없는 간단한 한 줄 수정입니다.

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

79
간단하고 우아합니다. 대신 '...'줄임표에 HTML 엔터티를 사용할 수도 있습니다.'&hellip;'
Tom Harrison

아마도 가장 고통스러운 해결책 일 것입니다. 필터는 상대적으로 무겁기 때문에 거대한 ng-repeat 목록에서 성능 문제가 발생할 수 있습니다! :)
Cowwando

1
대박! 여러 문자가 아닌 여러 줄을 잘라내는 방법이 있습니까?
axd

@axd CSS로 시도하거나 지시문을 작성하여 달성해야합니다.
Govan

1
이것이 가장 좋은 대답입니다. 합리적인 횟수의 ng-repeat로 성능 적중은 무시할 수 있어야합니다. 잘 려야하는 콘텐츠가 포함 된 수백 개의 ng-repeat를 다시 가져 오는 경우 드로잉 보드로 돌아 가야 할 수 있습니다. 좋은 답변, @Govan
erier

59

나는 이것이 늦었지만 최신 버전의 angularjs (1.2.16을 사용하고 있음)에서 limitTo 필터는 문자열뿐만 아니라 배열을 지원하므로 다음과 같이 문자열의 길이를 제한 할 수 있습니다.

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

출력됩니다 :

My String

9
이 솔루션에는 "..."가 없습니다. 결과는 다음과 같아야합니다. "My String ..."
Snæbjørn

줄임표가 보이지 않습니다 : plnkr.co/edit/HyAejS2DY781bqcT0RgV?p=preview . 정교하게 할 수 있습니까?
날씬한

2
@ Snæbjørn의 말은 질문을 한 사람이 잘린 문자열의 끝에 "..."를 삽입하는 솔루션을 선호한다는 것입니다. Govan의 대답은 그렇게합니다.
Nahn

@Nahn 지적 해 주셔서 감사합니다. 아마 다른 답변 대신 EpokK의 답변에 의견을 말했을 것입니다.
슬림

52

div에 CSS 클래스를 추가하고 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
텍스트 오버플로 : 줄임표, 좋은 것.
Chris Russo

4
이 기술은 굉장하지만 텍스트 줄 바꿈을 방지합니다
Larry

이것이 정답입니다. 나의 일반적인 규칙은 "CSS로 할 수있는 것을 JavaScript로하지 말라"입니다.
aidan

4
이것은 단락 당 한 줄의 텍스트에만 적용됩니다. 여러 줄로 된 css-tricks.com/line-clampin을 참조하십시오 (모든 브라우저에서 지원하지는 않습니다).
Robert

이것은 배열의 길이를 제한하려는 경우에도 작동합니다 ng-repeat.
chakeda

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

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>



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에서는 아래와 같이 각도 자체에서 제공하는 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 클래스를 변경하기 위해 더 많은 텍스트를 추가하고 각도 클릭 hadler를 추가 할 수 있습니다

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

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

2

두 개의 바인딩이있는 경우 {{item.name}}{{item.directory}}.

그리고 '/ root'를 디렉토리로 가정하고 'Machine'을 이름 (/ root-machine)으로 가정하여 데이터를 디렉토리와 그 뒤에 이름으로 표시하려고합니다.

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

이 질문에 대한 답변이 잘못된 질문에 게시되었을 가능성이 있습니까? 이것은 AngularJS로 문자열의 길이를 제한하는 것과 관련이없는 것처럼 보입니다.
BSMP



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

이 솔루션은 순수하게 HTML에서 ng 태그를 사용합니다.

해결책은 끝에 '더보기 ...'링크로 표시되는 긴 텍스트를 제한하는 것입니다. 사용자가 '더보기 ...'링크를 클릭하면 나머지 텍스트가 표시되고 '더보기 ...'링크가 제거됩니다.

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

가장 쉬운 해결책-> 내가 찾은 것은 Material Design (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

사용자 정의 각도 필터로 단어 수 제한 : 다음은 각도 필터를 사용하여 사용자 정의 필터를 사용하여 표시되는 단어 수를 제한하는 방법입니다.

HTML :

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

각도 / 자바 스크립트 코드

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.