Angular2でテキストを切り捨てる方法は?


126

文字列の長さを数字に制限する方法はありますか?たとえば:タイトルの長さを20に制限する必要があります{{ data.title }}

長さを制限するパイプやフィルターはありますか?

回答:


380

テキストを角度に切り詰める2つの方法。

let str = 'How to truncate text in angular';

1.ソリューション

  {{str | slice:0:6}}

出力:

   how to

次のようなスライス文字列の後にテキストを追加したい場合

   {{ (str.length>6)? (str | slice:0:6)+'..':(str) }}

出力:

 how to...

2.ソリューション(カスタムパイプの作成)

カスタムの切り捨てパイプを作成する場合

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
 name: 'truncate'
})

export class TruncatePipe implements PipeTransform {

transform(value: string, args: any[]): string {
    const limit = args.length > 0 ? parseInt(args[0], 10) : 20;
    const trail = args.length > 1 ? args[1] : '...';
    return value.length > limit ? value.substring(0, limit) + trail : value;
   }
}

マークアップ

{{ str | truncate:[20] }} // or 
{{ str | truncate:[20, '...'] }} // or

モジュールエントリを追加することを忘れないでください。

@NgModule({
  declarations: [
    TruncatePipe
  ]
})
export class AppModule {}

パフォーマンスの良いソリューションはどれですか。ソリューション1またはソリューション2。ソリューション1はパフォーマンスが良いと思います。
Rigin Oommen

nullステートメントをreturnステートメントに追加したい場合があります。私の場合、空の文字列を渡していたため、アプリがクラッシュしていました。 return value && value.length > limit ? value.substring(0, limit) + trail : value;
Wildhammer

@ketan:私は両方の解決策を完全に試してみましたが、私のシナリオは異なります。最初は50文字を表示しており、[もっと読む]リンクをクリックすると、より多くのテキストが表示されるので、上記で可能なことを教えてください。
Kapil soni

溶液2に、transform(value: string, args: string[]): stringあるべきであるtransform(value: string, args: any[]): stringパイプに与えられた最初の引数が数値であるからです。
MattOnyx

:こんにちはKetan、あなたはこの答えてくださいすることができますstackoverflow.com/questions/61040964/...
Tanzeel

83

オプションのパラメーターを使用してパイプを切り捨てます

  • 制限 -文字列の最大長
  • completeWords-文字ではなく、最も近い完全な単語で切り捨てるフラグ
  • 省略記号 -追加された末尾のサフィックス

-

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'truncate'
})
export class TruncatePipe implements PipeTransform {
  transform(value: string, limit = 25, completeWords = false, ellipsis = '...') {
    if (completeWords) {
      limit = value.substr(0, limit).lastIndexOf(' ');
    }
    return value.length > limit ? value.substr(0, limit) + ellipsis : value;
  }
}

モジュールエントリを追加することを忘れないでください。

@NgModule({
  declarations: [
    TruncatePipe
  ]
})
export class AppModule {}

使用法

文字列の例:

public longStr = 'A really long string that needs to be truncated';

マークアップ:

  <h1>{{longStr | truncate }}</h1> 
  <!-- Outputs: A really long string that... -->

  <h1>{{longStr | truncate : 12 }}</h1> 
  <!-- Outputs: A really lon... -->

  <h1>{{longStr | truncate : 12 : true }}</h1> 
  <!-- Outputs: A really... -->

  <h1>{{longStr | truncate : 12 : false : '***' }}</h1> 
  <!-- Outputs: A really lon*** -->

7
パイプを提供するためのおかげで、limit = value.substr(0, 13).lastIndexOf(' ');する必要がありますlimit = value.substr(0, limit).lastIndexOf(' ');けれども。
Tomnar

1
次のようなものを追加することもできます:if (!value) { return ''; }および if (value.length <= limit) { return value; }
JarekSzczepański18年

これを機能させるには、@ ngModuleのエクスポート部分にも追加する必要がありました。理由は不明
tibi

@tibiそれは新しいコンポーネントのようなものであり、それを使用するには宣言(配列の宣言)する必要があります。
calios

1
不要な値に省略記号が追加されないようにするには、 `if(value.length <limit){return value;を使用します。} else {return ${value.substr(0, limit)}${ellipsis}; } `
jabu.hlong

13

CSSに基づいてテキストを切り捨てることができます。幅ではなく文字に基づいてテキストを切り詰めるのに役立ちます。

CSS

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

.content {
            width:100%;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
        }

HTML

<div class="content">
    <span class="truncate">Lorem Ipsum is simply dummied 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. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</span>
</div>

注:このコードは、1行ではなく完全な1行を使用します。

ケタンのソリューションは、Angularで実行する場合に最適です


2
この。これは千倍!
brunner

アクセシビリティに最適
Antonello Pasella

4

私はこのモジュールng2 truncateを使用してきました、その非常に簡単なインポートモジュールとuは準備ができています... in {{data.title | トランケート:20}}


ここに移動します:npmjs.com/package/@yellowspot/ng-truncate
tibi

これをインポートした後、テストが失敗しました。jestに有線エラーがありました。
tibi

@tibiどんなエラー?私にとっては非常に簡単でした。インストール>モジュールにインポート>そのコンポーネントで使用します
。– Kerim092

3

を使用して、マークアップでをinterface介して渡されるオプションオブジェクトの形状を記述する別の方法を次に示しますpipe

@Pipe({
  name: 'textContentTruncate'
})
export class TextContentTruncatePipe implements PipeTransform {

  transform(textContent: string, options: TextTruncateOptions): string {
    if (textContent.length >= options.sliceEnd) {
      let truncatedText = textContent.slice(options.sliceStart, options.sliceEnd);
      if (options.prepend) { truncatedText = `${options.prepend}${truncatedText}`; }
      if (options.append) { truncatedText = `${truncatedText}${options.append}`; }
      return truncatedText;
    }
    return textContent;
  }

}

interface TextTruncateOptions {
  sliceStart: number;
  sliceEnd: number;
  prepend?: string;
  append?: string;
}

次に、マークアップで:

{{someText | textContentTruncate:{sliceStart: 0, sliceEnd: 50, append: '...'} }}


1

単語数で切り捨てて省略記号を追加したい場合は、次の関数を使用できます。

truncate(value: string, limit: number = 40, trail: String = '…'): string {
  let result = value || '';

  if (value) {
    const words = value.split(/\s+/);
    if (words.length > Math.abs(limit)) {
      if (limit < 0) {
        limit *= -1;
        result = trail + words.slice(words.length - limit, words.length).join(' ');
      } else {
        result = words.slice(0, limit).join(' ') + trail;
      }
    }
  }

  return result;
}

例:

truncate('Bacon ipsum dolor amet sirloin tri-tip swine', 5, '…')
> "Bacon ipsum dolor amet sirloin…"

次から取得:https : //github.com/yellowspot/ng2-truncate/blob/master/src/truncate-words.pipe.ts

複数の文字で切り捨てたいが、単語は切り取らない場合は、次のようにします。

truncate(value: string, limit = 25, completeWords = true, ellipsis = '…') {
  let lastindex = limit;
  if (completeWords) {
    lastindex = value.substr(0, limit).lastIndexOf(' ');
  }
  return `${value.substr(0, limit)}${ellipsis}`;
}

例:

truncate('Bacon ipsum dolor amet sirloin tri-tip swine', 19, true, '…')
> "Bacon ipsum dolor…"

truncate('Bacon ipsum dolor amet sirloin tri-tip swine', 19, false, '…')
> "Bacon ipsum dolor a…"

1

@Timothy Perezの回答を試して、1行追加しました

if (value.length < limit)
   return `${value.substr(0, limit)}`;

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'truncate'
})
export class TruncatePipe implements PipeTransform {
transform(value: string, limit = 25, completeWords = false, ellipsis = '...') {

   if (value.length < limit)
   return `${value.substr(0, limit)}`;

   if (completeWords) {
     limit = value.substr(0, limit).lastIndexOf(' ');
   }
   return `${value.substr(0, limit)}${ellipsis}`;
}
}

0

完全なテキストを表示するオプションも許可しながら、文字ではなく単語に基づいて切り捨てたい場合は、これを試してください。

ここに来て、単語基づいRead Moreソリューションを探して、Pipe結局私が書いたカスタムを共有しました。

パイプ:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'readMore'
})
export class ReadMorePipe implements PipeTransform {

  transform(text: any, length: number = 20, showAll: boolean = false, suffix: string = '...'): any {

    if (showAll) {
      return text;
    }

    if ( text.split(" ").length > length ) {

      return text.split(" ").splice(0, length).join(" ") + suffix;
    }

    return text;
  }

}

テンプレート内:

<p [innerHTML]="description | readMore:30:showAll"></p>
<button (click)="triggerReadMore()" *ngIf="!showAll">Read More<button>

成分:

export class ExamplePage implements OnInit {

    public showAll: any = false;

    triggerReadMore() {
        this.showAll = true;
    }

}

モジュール内:

import { ReadMorePipe } from '../_helpers/read-more.pipe';

@NgModule({
  declarations: [ReadMorePipe]
})
export class ExamplePageModule {}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.