我创建了一个在父级中使用的自动完成子级组件。在父级中,当尝试使用Bootstrap表单控件应用验证时,它不会应用到此子组件-该子组件是带有列表的输入框,尽管它正在应用到不是子组件的其他控件。
子组件HTML:
<div class="searching">
<input type="text" class="form-control" (input)="getFilteredData(inputBox.value);" class="form-control" [formControl]="inputBox">
<div id="search" tabindex="0" >
<ul class="suggestionList">
<li *ngFor="let result of filteredResults | async" (click)="onUserSelected(result)" >{{result[displayField1]}} | {{result[displayField2]}} {{result[displayField3]}}</li>
</ul>
</div>
</div>
父组件:
<app-auto-complete formControlName="requestorId"
[ngClass]="{ 'is-invalid': submitted &&
requestorId.errors }"></app-auto-complete>
<div *ngIf="submitted && f.requestorId.errors" class="invalid-feedback">
<div *ngIf="f.requestorId.errors.required">Requestor ID is required</div>
</div>
子CSS:
.searching {
width: inherit;
position: relative;
}
.searching input {
margin: 0;
padding: 0;
width: 100%;
height: 30px;
}
.suggestionList {
background-color: #fff;
width: 100%;
position: absolute;
padding: 0;
left: 0;
z-index: 1000;
}
.suggestionList li {
list-style-type: none;
border: 1px solid #c5c5c5;
cursor: pointer;
left: 0;
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
text-align: left;
}
答案 0 :(得分:0)
我有几个工作原理,希望对您有所帮助。
如注释中所述,在您的父组件装饰器中添加具有ViewEncapsulation.None的属性“ encapsulation”(与“ selector”相同的级别)。
请注意,这种方法会使父组件的样式渗透到整个应用程序中,因此请谨慎行事,除非您使父选择器非常具体,例如.my-specific-parent-selector-which-isnt-gonna-be-repeated
在子组件上使用@Input属性传递验证布尔值,并根据传递的Input直接应用该类。
向父级添加.parent-selector .is-invalid
选择器,然后在其后添加::ng-deep .parent-selector .is-invalid
,以使特定样式渗透子类。请谨慎使用此方法,但将来可能会停止工作(尽管不太可能)
注意:
还请注意,您正在将is-invalid
类应用于选择器。.如果使用chrome Web浏览器进行检查,您会发现此选择器通常是与尝试添加类的元素不同的元素,因此也许最好的方法是使用输入