Batasi panjang string dengan AngularJS


225

Saya memiliki yang berikut ini:

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

Apakah ada cara agar saya dapat membatasi panjang string untuk mengatakan 20 karakter?

Dan pertanyaan yang lebih baik adalah apakah ada cara saya bisa mengubah string untuk dipotong dan ditampilkan ...di akhir jika lebih dari 20 karakter?


Jawaban:


344

Edit Versi terbaru dari filterAngularJS penawaranlimitTo .

Anda memerlukan filter khusus seperti ini:

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 || ' …');
        };
    });

Pemakaian:

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

Pilihan:

  • wordwise (boolean) - jika benar, potong hanya dengan kata-kata batas,
  • maks (bilangan bulat) - panjang maksimal teks, potong ke jumlah karakter ini,
  • tail (string, default: '...') - tambahkan string ini ke string input jika string terpotong.

Solusi lain : http://ngmodules.org/modules/angularjs-truncate (oleh @Ehvince)


2
Ada yang setara di angular-modules: ngmodules.org/modules/angularjs-truncate
Ehvince

angularjs-truncate bukan solusi, tetapi solusi IS Anda. Terima kasih! Jadikan sebagai modul!
Anton Bessonov

@epokk Ada cara untuk memungkinkan pengguna, setelah mengklik tiga titik, menunjukkan teks yang belum dipotong? Suka "tunjukkan lebih banyak"? Terima kasih!
Thales P

ini berfungsi dengan baik ketika kita menggunakannya seperti ini {{post.post_content | cut: true: 100: '...'}} Tetapi gagal ketika saya menggunakan seperti ini <span ng-bind-html = "dipercayaHtml (post.post_content | cut: true: 100: '...')"> < / span> Karena saya terpaksa menggunakannya dengan html tepercaya dalam kasus saya
S Vinesh

Batas wordwise adalah fitur bagus yang sepertinya tidak ada dalam "limitTo" default
pdizz

496

Berikut adalah perbaikan satu baris sederhana tanpa css.

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

79
Sederhana dan elegan. Alih-alih, '...'Anda juga dapat menggunakan entitas HTML untuk ellipsis:'&hellip;'
Tom Harrison

mungkin solusi yang paling tidak menyakitkan. Tetap ingat bahwa filter relatif berat dan ini mungkin memiliki masalah kinerja pada daftar ng-repeat yang sangat besar! :)
Cowwando

1
luar biasa! apakah ada cara untuk memotong setelah beberapa baris, daripada setelah beberapa karakter?
axd

@ Maxd Anda harus mencobanya di css atau menulis arahan untuk mencapainya.
Pemerintah

1
Ini jawaban terbaik. Performa hit harus diabaikan dengan jumlah ng-repeat yang masuk akal. Jika Anda membawa kembali ratusan ng-repeat dengan konten yang perlu dipotong maka mungkin perlu kembali ke papan gambar. Jawaban yang bagus, @Govan
erier

59

Saya tahu ini terlambat, tetapi dalam versi terbaru dari angularjs (Saya menggunakan 1.2.16) filter limitTo mendukung string dan juga array sehingga Anda dapat membatasi panjang string seperti ini:

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

yang akan menghasilkan:

My String

9
Solusi ini tidak memiliki "...". Hasilnya harus: "Senar Saya ..."
Snæbjørn

Saya tidak melihat elips di sini: plnkr.co/edit/HyAejS2DY781bqcT0RgV?p=preview . Bisakah Anda menguraikan?
langsing

2
Apa yang dikatakan @ Snæbjørn adalah bahwa orang yang mengajukan pertanyaan lebih memilih solusi yang memasukkan "..." di akhir string yang terpotong. Jawaban Govan melakukan itu.
Nahn

@Nah, terima kasih sudah menunjukkannya. Saya mungkin harus membuat komentar untuk jawaban EpokK daripada jawaban lain.
langsing

52

Anda cukup menambahkan kelas css ke div, dan menambahkan tip alat melalui angularjs sehingga teks yang dipangkas akan terlihat di mouse.

<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: ellipsis, bagus.
Chris Russo

4
teknik ini, walaupun mengagumkan, mencegah pembungkus teks
Larry

Ini jawaban yang benar. Aturan umum saya adalah: "jangan lakukan dalam JavaScript apa yang bisa dilakukan dalam CSS".
Aidan

4
Ini hanya berfungsi untuk teks dengan satu baris per paragraf. Lihat untuk multiline css-tricks.com/line-clampin (tidak semua browser mendukungnya).
Robert

Ini juga berfungsi jika Anda mencoba membatasi panjang array ng-repeat.
chakeda

27

Saya punya masalah serupa, berikut ini yang saya lakukan:

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

Saya akan menghapus spasi putih di antara kedua output untuk menghindari jeda baris
Ignacio Vazquez

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

Pendekatan sederhana, namun fungsional. Tetapi diasumsikan bahwa setiap judul akan memiliki lebih dari 20 karakter dan ini, dalam beberapa kasus, mungkin tidak terduga.
Henrique M.

18

Solusi yang lebih elegan:

HTML:

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

Kode Sudut:

 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) + '...';
   };
}]);

Demo:

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


Dapatkah saya menyarankan menambahkan pengembalian jika inputnilainya dinamis? yaitu kalau if (!input) {return;}tidak akan ada kesalahan konsol JS
mcranston18

1
@ mcranston18 menambahkan. Terima kasih.
Anam

15

Karena kita membutuhkan ellipsis hanya ketika panjang string melebihi batas, tampaknya lebih tepat untuk menambahkan ellipsis dengan menggunakan ng-ifdaripada mengikat.

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

7

Ada opsi

.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

Berikut filter khusus untuk memotong teks. Ini terinspirasi oleh solusi EpokK tetapi dimodifikasi untuk kebutuhan dan selera saya.

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 + '...';
    };
});

Dan di sini adalah unit test sehingga Anda dapat melihat bagaimana seharusnya berperilaku:

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

Anda dapat membatasi panjang string atau array dengan menggunakan filter. Periksa ini ditulis oleh tim AngularJS.


berikan beberapa rincian lebih lanjut juga
Parixit

3

Dalam html ini digunakan bersama dengan filter limitTo yang disediakan oleh angular itu sendiri seperti di bawah ini ,

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

filter keepDots:

     App.filter('keepDots' , keepDots)

       function keepDots() {

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

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

        }


    }

3

Jika Anda menginginkan sesuatu seperti: InputString => StringPart1 ... StringPart2

HTML:

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

Kode Sudut:

 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) ;
   };
}]);

Contoh dengan parameter berikut:
beginLimit = 10
endLimit = 20

Sebelum : - /home/house/room/etc/ava_B0363852D549079E3720DF6680E17036.jar
Setelah : - /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

Ini mungkin bukan dari akhir skrip tetapi Anda dapat menggunakan css di bawah ini dan menambahkan kelas ini ke div. Ini akan memotong teks dan juga menampilkan teks lengkap di atas mouse. Anda dapat menambahkan lebih banyak teks dan menambahkan hadler klik sudut untuk mengubah kelas div di cli

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

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

2

Jika Anda memiliki dua binding {{item.name}}dan{{item.directory}} .

Dan ingin menampilkan data sebagai direktori diikuti dengan nama, dengan asumsi '/ root' sebagai direktori dan 'Mesin' sebagai nama (/ root-mesin).

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

Apakah ada kemungkinan Anda memposting jawaban ini pada pertanyaan yang salah? Tampaknya ini tidak ada hubungannya dengan membatasi panjang string dengan AngularJS.
BSMP


1
<div>{{modal.title | slice: 0: 20}}</div>

0

Saya membuat arahan ini yang dengan mudah melakukan itu, memotong string ke batas yang ditentukan dan menambahkan "show more / less" toggle. Anda dapat menemukannya di GitHub: https://github.com/doukasd/AngularJS-Components

dapat digunakan seperti ini:

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

Inilah arahannya:

// 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);
            }
        });
    }
};
}]);

Dan beberapa CSS untuk digunakan:

.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

Solusi ini murni menggunakan ng tag pada HTML.

Solusinya adalah membatasi teks panjang yang ditampilkan dengan tautan 'tunjukkan lebih lanjut ...' di bagian akhir. Jika pengguna mengeklik tautan 'tunjukkan lebih lanjut ...', itu akan menampilkan seluruh teks dan menghapus tautan 'tampilkan lebih banyak ...'.

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

SOLUSI TERMUDAH -> yang saya temukan adalah membiarkan Material Design (1.0.0-rc4) melakukan pekerjaannya. The md-input-containerakan melakukan pekerjaan untuk Anda. Ini merangkai string dan menambahkan elipses plus memiliki keuntungan ekstra memungkinkan Anda mengkliknya untuk mendapatkan teks lengkap sehingga seluruh enchilada. Anda mungkin perlu mengatur lebar 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

Batasi jumlah kata dengan filter Angular khusus: Berikut adalah cara saya menggunakan filter Angular untuk membatasi jumlah kata yang ditampilkan menggunakan filter khusus.

HTML:

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

Kode Sudut / 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

Ini berfungsi baik untuk saya 'Dalam rentang', ng-show = "MyCtrl.value. $ ViewValue.length> your_limit" ... baca selengkapnya. 'rentang akhir'


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.