#css #angular #bootstrap-4
#css #angular #bootstrap-4
Вопрос:
Я создал дочерний компонент автозаполнения, который я использую в родительском. В родительском элементе при попытке применить проверку с помощью элемента управления формой начальной загрузки она не применяется к этому дочернему компоненту, который представляет собой поле ввода со списком, хотя она применяется к другим элементам управления, которые не являются дочерними.
Дочерний компонент 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 amp;amp;
requestorId.errors }"></app-auto-complete>
<div *ngIf="submitted amp;amp; 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;
}
Комментарии:
1. Чтобы переопределить правило стиля в файле стиля компонента, добавьте это в свой component.ts
encapsulation: ViewEncapsulation.None
2. Или попробуйте использовать ::ng-deep .searching, если я правильно понял ваш вопрос.
3. ::ng-deep .searching в css дочернего компонента или в saas?
Ответ №1:
У меня есть несколько обходных путей, поэтому я надеюсь, что это поможет.
Как упоминалось в комментариях, добавьте в декоратор вашего родительского компонента свойство ‘encapsulation’ (того же уровня, что и ‘selector’ и тому подобное) с ViewEncapsulation.None . Имейте в виду, что при таком подходе стили родительского компонента проникают во все приложение, поэтому будьте осторожны при выполнении этого, если у вас нет родительского селектора, который был бы действительно специфичным, например .my-specific-parent-selector-which-isnt-gonna-be-repeated
используйте свойство @Input для дочернего компонента, чтобы передать логическое значение проверки, и примените класс непосредственно в соответствии с переданными входными данными.
добавьте .parent-selector .is-invalid
селектор к родительскому, а затем добавьте за ним ::ng-deep .parent-selector .is-invalid
, чтобы этот конкретный стиль проникал в дочерние классы. Имейте в виду, что этот подход устарел, поэтому он может перестать работать в будущем (хотя это маловероятно)
Примечание: также обратите внимание, что вы применяете is-invalid
класс к селектору .. если вы проверите с помощью веб-браузера Chrome, вы увидите, что этот селектор обычно отличается от элемента, в который вы пытаетесь добавить свой класс… так что, возможно, ваш лучший подход — использовать входные данные
Комментарии:
1. Мне нравится подход 2: используйте свойство @Input. Не могли бы вы подробнее рассказать об этом.
2. Конечно!… если вы добавите декоратор @Input() к параметру вашего дочернего класса (например,
@Input() invalid: boolean
тогда вы можете передавать данные своему дочернему компоненту через привязку из вашего родительского компонента следующим образом:<div class="parent-component"><child-comp [invalid]="parentBool"></child-comp></div>
таким же образом, как вы передаете такие вещи, как [отключено] или около того .. кроме того, есть декоратор вывода для передачи данных родительским компонентам, на которые вам также следует обратить внимание !… если я недостаточно ясно выразился, пожалуйста, скажите мне, чтобы уточнить. Удачного кодирования!3. но у меня есть другой вопрос относительно шаблона проектирования. У меня есть свойства @input и @output как в родительском, так и в дочернем компоненте, есть ли лучший способ его разработки. необходимо запустить 2-3 события обратной передачи (Event emiter) от родительского элемента к дочернему, а затем от дочернего элемента к родительскому. ` в родительском: private autoFocusLost: EventEmitter<boolean> = new EventEmitter();, а затем в дочернем: @Output() SelectionChanged: EventEmitter<any> = new EventEmitter(); @Output() inputEdited: EventEmitter<any> = new EventEmitter(); `
4. Это означает, что в вашей реализации есть компоненты внутри compoents, и я считаю, что это нормально. Я могу ошибаться, и кто-нибудь мог бы просветить меня. Однако, если это интеллектуальные компоненты, вы могли бы создать службу, которая управляет этими значениями, и внедрить их в основной дочерний компонент. Если они являются немыми компонентами, это невыполнимо, хотя я думаю, или, по крайней мере, не предпочтительно.
5. вы имеете в виду создание общего сервиса между родительским и дочерним компонентами. Оба считывают / обновляют значение в этой службе?