如何在指令 属性 中设置初始值
How to set initial value in directive property
在这个 plunker 中:
我有一个名为 myTrimmer
的属性指令,用于修剪长文本:
对于静态文本效果很好
<div myTrimmer="10">some longgggg texttttttttttttttt</div>
但不适用于插值:
<div myTrimmer="10">{{myText}}</div>
这意味着它在第
行采用空字符串而不是 myText
this.originalValue = this.el.nativeElement.innerHTML;
这里设置了属性指令:
set myTrimmer(value: string) {
this.originalValue = this.el.nativeElement.innerHTML;
this.length = +value;
if (+value < this.el.nativeElement.innerHTML.length)
this.el.nativeElement.innerHTML = this.el.nativeElement.innerHTML.substring(0, value) + '...';
}
因为 angular 还没有编译 {{myText}}
。要让 angular 编译 {{myText}}
,您需要推迟 trimmer 函数。为此,您可以使用 javascript setTimeout
函数,如下所示:
set myTrimmer(value: string) {
var myTrim = this;
setTimeout(function(){
myTrim .originalValue = myTrim .el.nativeElement.innerHTML;
myTrim .length = +value;
if (+value < myTrim .el.nativeElement.innerHTML.length)
myTrim .el.nativeElement.innerHTML = myTrim .el.nativeElement.innerHTML.substring(0, value) + '...';
});
}
已编辑Plunker
我想这样你需要等待这样的 AfterViewInit
事件:
export class MyTrimmer {
myTrimmer: string;
ngAfterViewInit() {
this.originalValue = this.el.nativeElement.innerHTML;
console.log(this.originalValue);
this.length = +this.myTrimmer;
if (+this.myTrimmer < this.el.nativeElement.innerHTML.length)
this.el.nativeElement.innerHTML =
this.el.nativeElement.innerHTML.substring(0, this.myTrimmer) + '...';
}
}
另请参阅此更新的 plunkr https://plnkr.co/edit/MccvTyQxSpcgO6Tj99QX?p=preview
您可以像这样使用 "TrimPipe":
{{myText | trim:10}}
管道代码:
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({name: 'trim'})
export class TrimPipe implements PipeTransform {
transform(text: any, trimValue: number) {
if (!text) {
return '';
}
return text.substring(0, trimValue) + '...';
}
}
在这个 plunker 中:
我有一个名为 myTrimmer
的属性指令,用于修剪长文本:
对于静态文本效果很好
<div myTrimmer="10">some longgggg texttttttttttttttt</div>
但不适用于插值:
<div myTrimmer="10">{{myText}}</div>
这意味着它在第
行采用空字符串而不是myText
this.originalValue = this.el.nativeElement.innerHTML;
这里设置了属性指令:
set myTrimmer(value: string) {
this.originalValue = this.el.nativeElement.innerHTML;
this.length = +value;
if (+value < this.el.nativeElement.innerHTML.length)
this.el.nativeElement.innerHTML = this.el.nativeElement.innerHTML.substring(0, value) + '...';
}
因为 angular 还没有编译 {{myText}}
。要让 angular 编译 {{myText}}
,您需要推迟 trimmer 函数。为此,您可以使用 javascript setTimeout
函数,如下所示:
set myTrimmer(value: string) {
var myTrim = this;
setTimeout(function(){
myTrim .originalValue = myTrim .el.nativeElement.innerHTML;
myTrim .length = +value;
if (+value < myTrim .el.nativeElement.innerHTML.length)
myTrim .el.nativeElement.innerHTML = myTrim .el.nativeElement.innerHTML.substring(0, value) + '...';
});
}
已编辑Plunker
我想这样你需要等待这样的 AfterViewInit
事件:
export class MyTrimmer {
myTrimmer: string;
ngAfterViewInit() {
this.originalValue = this.el.nativeElement.innerHTML;
console.log(this.originalValue);
this.length = +this.myTrimmer;
if (+this.myTrimmer < this.el.nativeElement.innerHTML.length)
this.el.nativeElement.innerHTML =
this.el.nativeElement.innerHTML.substring(0, this.myTrimmer) + '...';
}
}
另请参阅此更新的 plunkr https://plnkr.co/edit/MccvTyQxSpcgO6Tj99QX?p=preview
您可以像这样使用 "TrimPipe":
{{myText | trim:10}}
管道代码:
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({name: 'trim'})
export class TrimPipe implements PipeTransform {
transform(text: any, trimValue: number) {
if (!text) {
return '';
}
return text.substring(0, trimValue) + '...';
}
}