Answers:
将文本截断成角的两种方法。
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 {}
return value && value.length > limit ? value.substring(0, limit) + trail : value;
transform(value: string, args: string[]): string
应该是transform(value: string, args: any[]): string
因为给管道的第一个参数是一个数字。
使用可选参数截断管道:
--
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*** -->
limit = value.substr(0, 13).lastIndexOf(' ');
应该是limit = value.substr(0, limit).lastIndexOf(' ');
。
if (!value) { return ''; }
和 if (value.length <= limit) { return value; }
${value.substr(0, limit)}${ellipsis}
; }`
您可以基于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>
注意:此代码在一行中全部使用,最多使用一行。
如果您想通过Angular做到,最好的是Ketan解决方案
我一直在使用ng2 truncate这个模块,它非常简单,导入模块,您可以在{{data.title | 截断:20}}
这是一种使用的替代方法,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: '...'} }}
根据您的要求,使用切片管(角形芯管)非常简单data.title
:
{{ data.title | slice:0:20 }}
从Angular通用文档https://angular.io/api/common/SlicePipe
如果要截断多个单词并添加省略号,则可以使用以下功能:
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…"
刚刚尝试过@Timothy Perez答案并添加了一行
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}`;
}
}
如果要基于单词而不是字符截断,请尝试执行此操作,同时还可以选择查看全文。
来到这里寻找基于单词的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 {}