我有一个使用angular 5和typescript开发的角度项目。在组件的html模板中,我有一个文本区域框。我想使此文本区域中的前几个字符不可编辑。
例如,从我的组件ts文件中,我可以将初始值(例如:“ RMO”)设置为我的文本区域。
用户无法删除在文本区域中设置的文本“ RMO”。
我有一些jquery代码来实现此目的(http://jsfiddle.net/zq4c873L/1/),然后将其转换为打字稿代码。但是效果不佳
这是我在组件html模板中定义的文本区域。
<textarea id="messageTxt" formControlName="message" rows="6" [placeholder]="'PLACEHOLDERS.MESSAGE' | translate" (keydown)="ensureMessagePrefixNonEditable(messageTxt.value)" (keyup)="calculateMessagingSegmentCount(messageTxt.value)" #messageTxt></textarea>
每当用户按下一个键时就会触发一个功能。也就是说,请确保MessagePrefixNonEditable(messageTxt.value)。如果文本值与特定搜索字符串的文本区域内容不匹配,则此函数尝试替换旧值。以下是我的功能。
ensureMessagePrefixNonEditable(inputTxtMsg: string){
console.log(inputTxtMsg);
let originalValue: string = inputTxtMsg;
if( !inputTxtMsg.startsWith(this.messagePrefix.concat(' ')) ) {
this.messageControl.setValue(originalValue);
}
}
但是问题是我能够从文本区域中删除预定义的值。知道函数sureMessagePrefixNonEditable中有什么问题。非常感谢您的帮助
我也按如下方式重写功能,但仍然是问题
ensureMessagePrefixNonEditable(inputTxtMsg: string){
let originalValue: string = inputTxtMsg;
let messagePrefixSearchWithSpace: string = this.messagePrefix.concat(' ');
let regex: RegExp = new RegExp("^" + originalValue+ "$");
if(!regex.test(messagePrefixSearchWithSpace)){
this.messageControl.setValue(originalValue);
this.formGroup.patchValue( {message: originalValue });
}
}
我可以看到它进入了if块,但是this.formGroup.patchValue({message:originalValue});没有在用户界面中使用原始字符串设置消息文本区域。
谢谢
答案 0 :(得分:1)
使用ngModelChange事件处理程序的角反应形式版本
private currentValue = "";
constructor(
private formBuilder: FormBuilder,
) {
this.loginForm = this.formBuilder.group({
messageTxt: ["", Validators.required]
});
}
public async ngOnInit() {
this.loginForm.controls["messageTxt"].setValue("RMO");
this.currentValue = "RMO";
}
public keepRMO($event) {
let prefix = "RMO";
if ($event.substring(0, 3) !== prefix) {
alert("You are not allowed to remove the first three characters('RMO')");
this.loginForm.controls["messageTxt"].setValue(this.currentValue);
} else {
this.currentValue = $event;
}
}
html:
<textarea
class="form-control"
name="messageTxt"
id="messageTxt"
formControlName="messageTxt"
rows="6"
(ngModelChange)="keepRMO($event)"
></textarea>
答案 1 :(得分:1)
这是我要使用的指令,您可能需要对其进行调整。它检查输入中包含的文本是否与您的正则表达式匹配,否则阻止按下键盘。
HTML:
<textarea regexDirective="your regex"></textarea>
指令:
@Directive({
selector: '[regexDirective]'
})
export class RestrictToPatternDirective {
@Input() appRestrictToPattern = ''; // should be your regex passed as an input in case it needs to be reusable
constructor(private elementRef: ElementRef) { }
@HostListener('keydown', ['$event']) onKeyDown(e: KeyboardEvent): void {
if (new RegExp(this.appRestrictToPattern).test(this.elementRef.nativeElement.value + e.key)) {
// let it happen, don't do anything
return;
} else {
e.preventDefault();
}
}
}