【发布时间】:2019-01-28 06:16:00
【问题描述】:
我成功地使用了 ng bootstrap,特别是模态模块来显示模态表单。这是一个包含电子邮件和消息输入字段以及提交按钮的联系表单。我正在使用的 ngbootstrap 模块是 https://ng-bootstrap.github.io/#/components/modal/examples 这显示得很好。我想要做的是,当用户单击“发送”按钮(请参阅下面的模板代码)时,该按钮将被禁用并显示“发送...”。换句话说,我正在尝试操作属性视图模式组件。
我已经查看了以下问题,但没有任何建议有效:
Angular 2 @ViewChild annotation returns undefined How to get reference of the component associated with ElementRef in Angular 2
无论如何,当我尝试在我的组件中使用时,我会得到“未定义”
@ViewChild('submitButton') submitButton: ElementRef;
连同我模板中的这个 html
<button #submitButton
id="submitButton"
class="btn btn-success w-100"
[disabled]="!contactForm.valid"
>Send</button>
这是完整的组件代码(我试图访问 submitButton 的地方是方法 onSubmit()):
import {
Component,
OnInit,
Renderer2,
ViewChild,
ElementRef,
AfterViewInit
} from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { NgbModal, ModalDismissReasons } from '@ng-bootstrap/ng-bootstrap';
import { ContactService } from '../../services/contact.service';
@Component({
selector: 'app-contact-modal',
templateUrl: './contact-modal.component.html'
})
export class ContactModalComponent implements OnInit, AfterViewInit {
closeResult: string;
contactForm: FormGroup;
//@ViewChild('submitButton') submitButton;
@ViewChild('submitButton') submitButton: ElementRef;
constructor(
private modalService: NgbModal,
private contactService: ContactService,
private renderer: Renderer2
) { }
ngOnInit() {
this.initForm();
}
ngAfterViewInit() {
console.log(this.submitButton);
}
private getDismissReason(reason: any): string {
if (reason === ModalDismissReasons.ESC) {
return 'by pressing ESC';
} else if (reason === ModalDismissReasons.BACKDROP_CLICK) {
return 'by clicking on a backdrop';
} else {
return `with: ${reason}`;
}
}
private initForm() {
const email = '';
const message = '';
this.contactForm = new FormGroup({
email: new FormControl(null, Validators.email),
message: new FormControl(null, Validators.required)
});
}
onSubmit() {
const email = this.contactForm.value.email;
const message = this.contactForm.value.message;
// at this point this.submitButton is UNDEFINED
console.log(this.submitButton);
//this.submitButton.nativeElement.style.backgroundColor = 'black';
this.contactService.sendContactRequest(email, message, (submitSuccess: boolean) => {
if (submitSuccess) {
console.log('SUCCESS UPDATE UI');
this.contactForm.value.email = '';
this.contactForm.value.message = '';
} else {
console.log('ERROR update UI');
}
});
}
open(content) {
console.log('in open func');
this.modalService.open(content, {ariaLabelledBy: 'modal-basic-title'})
.result
.then(
(result) => {
console.log(`Closed with: ${result}`);
},
(reason) => {
console.log(`Dismissed ${this.getDismissReason(reason)}`);
}
);
}
}
这是我的完整模板:
<a
class="nav-link"
(click)="open(content)"
><i class="fas fa-envelope"></i></a>
<ng-template #content let-c="close" let-d="dismiss">
<div class="modal-header">
<h4 class="modal-title" id="modal-basic-title">Contact Us</h4>
<button type="button" class="close" aria-label="Close" (click)="c()">
<i class="fas fa-times"></i>
</button>
</div>
<div class="modal-body">
<form [formGroup]="contactForm" (ngSubmit)="onSubmit()">
<div class="row justify-content-center">
<div class="col-md-12 col-sm-12">
<div class="form-group">
<label for="email">Email</label>
<input
type="text"
class="form-control"
id="email"
formControlName="email"
>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-12 col-sm-12">
<div class="form-group">
<label for="message">Message</label>
<textarea
type="text"
class="form-control"
id="message"
formControlName="message"
rows="6"
></textarea>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-12 col-sm-12">
<button #submitButton
id="submitButton"
class="btn btn-success w-100"
[disabled]="!contactForm.valid"
>Send</button>
</div>
</div>
<div class="row">
<div class="col-md-12 col-sm-12">
<div *ngIf="sentMessage" class="alert alert-success" role="alert">
{{ sentMessage }}
</div>
</div>
</div>
</form>
</div>
</ng-template>
非常感谢任何帮助。
【问题讨论】:
-
你能在stackblitz中添加你的代码吗
-
您在 ng-template 中的模板代码。你在哪里插入 DOM?
-
@SureshKumarAriya 你的评论给了我我需要的提示 - 我必须像这样使用 TemplateRef 获取模板:@ViewChild('content') content: TemplateRef
-
你需要使用@ViewChild('content', {read: ElementRef}) content: ElementRef; 来获取ElementRef。然后您可以使用 querySelector 查询内部子元素。 this.content.nativeElement.querySelector('.btn-classname')。您需要为按钮分配唯一的类名。
-
@SureshKumarAriya 我做了你指定的事情并得到“HeaderComponent.html:61 ERROR TypeError: this.content.nativeElement.querySelector is not a function”:@ViewChild('content', {read: ElementRef }) 内容:元素引用; - 当我 console.log(this.content);我看到 ElementRef {nativeElement: comment} 但 querySelector 不是对象的一部分......
标签: javascript angular typescript frontend ng-bootstrap