Угловая родительская форма-управление начальной загрузкой / CSS не применяется к дочернему компоненту

#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. вы имеете в виду создание общего сервиса между родительским и дочерним компонентами. Оба считывают / обновляют значение в этой службе?