我能否限制字符串的长度,比如:我需要将标题长度限制为20个字符{{ data.title }}
。
是否有管道或过滤器可以限制长度?
我能否限制字符串的长度,比如:我需要将标题长度限制为20个字符{{ data.title }}
。
是否有管道或过滤器可以限制长度?
将文本截断为角括号的两种方法。
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 {}
截断管道,带有可选的参数:
-
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(' ');
。 - Tomnarif (!value) { return ''; }
和
if (value.length <= limit) { return value; }
- Jarek Szczepańskiif (value.length < limit) {
return value;
} else {
return `${value.substr(0, limit)}${ellipsis}`;
}
- jabu.hlongsubstring
替换substr
。 - BeardedPrince您可以基于 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的解决方案,这是最佳选择。
就像这样:
{{ data.title | slice:0:20 }}
如果你想要省略号,这里有一个解决方法
{{ data.title | slice:0:20 }}...
data.title
没有被截断,这三个点号也不会出现吗? - Rohit Kumar{{ data.title | slice:0:20 }}{{ data.title.length > 20 ? '...' : '' }}
。 - sic-sic如果您想基于单词来截断文本,而不是字符,并且还想提供查看完整文本的选项,请尝试此方法。
如果您正在寻找基于单词的“阅读更多”解决方案,则可以使用下面的自定义管道。
管道:
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 {}
使用省略号截取字符串
无需额外的管道符,可以使用切片(slice)。
{{ stringText | slice: 0:25}} {{ stringText.length > 25 ? '...' : ''}}
data.title
进行操作:{{ data.title | slice:0:20 }}
来自Angular常用文档 https://angular.io/api/common/SlicePipe
以下是使用一个接口
来描述通过标记中的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: '...'} }}
我一直在使用这个模块ng2 truncate,它非常简单,只需要导入模块就可以使用了……在{{ data.title | truncate : 20 }}中。
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…"
return value && value.length > limit ? value.substring(0, limit) + trail : value;
- Wildhammertransform(value: string, args: string[]): string
应该改为transform(value: string, args: any[]): string
,因为管道的第一个参数是一个数字。 - MattOnyx