#javascript #angular #angular-material
#javascript #angular #angular-material
Вопрос:
Я хочу создать угловую директиву, которая при применении к любому элементу управления (элементам управления материалами), таким как matButton / matSelect / matAutcomplete и т. Д., Должна отключать управление на основе условия. Любая помощь.?
Комментарии:
1. является ли условие общим для всех этих элементов управления?
Ответ №1:
Это был бы процесс:
Создайте свою директиву, используя angular cli
ng generate directive customMatDisable
Это создаст для вас новый файл директивы .directive.ts
Внутри файла директивы манипулируйте элементом следующим образом
import { Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[customMatDisable]'
})
export class CustomMatDisableDirective {
constructor(el: ElementRef) {
if(//condition here){
el.nativeElement.disabled = true;
}
}
}
и используйте его, как показано ниже:
<button customMatDisable mat-raised-button >Button Text</button>
Обновить
Поскольку кажется, что директивы material переопределяют наш отключенный статус, поскольку его инициализация происходит после выполнения нашей директивы. Одним из обходных путей было бы сделать это следующим образом:
import { Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[customMatDisable]'
})
export class CustomMatDisableDirective {
constructor(el: ElementRef) {
if(//condition here){
setTimeout(()=>{
el.nativeElement.disabled = true;
el.nativeElement.classList.add("mat-button-disabled")
},1) //execute after 1 ms
}
}
}
Комментарии:
1. Привет… спасибо за ваше время .. но… я пробовал это … на самом деле это не работает для matbuttons… я создал stackblitz.. вы можете проверить это stackblitz.com/edit /…
2. @krishna Похоже, что наша директива была выполнена до того, как материальные элементы и их инициализация переопределили наш отключенный статус. Обходной путь заключается в том, чтобы обернуть наше утверждение в setTimeout . Я соответствующим образом обновлю ответ.
3. это отключит действие, но стили не будут обновлены …. я обновил stackblitz … можем ли мы это сделать?
4. @AdityaMenon, НЕ ставьте 1 для выполнения через 1 мс. Когда Angular находит setTimeout , он перерисовывает приложение после. кстати, лучше добавить ngOnInit
5. @krishna да, нам просто нужно добавить класс для этого, снова обновив. Показ примера для кнопки. В вашем реальном коде используйте регистр переключения, чтобы определить, к какому типу элемента он относится, и добавить соответствующий класс
Ответ №2:
Другой подход — ввести кнопки конструктора, matInput .. и отключить его
export class CustomMatDisableDirective implements OnInit {
constructor(
@Optional() @Self() private control:NgControl,
@Optional() @Self() private button:MatButton,
@Optional() @Self() private input:MatInput,
@Optional() @Self() private select:MatSelect,
@Optional() @Self() private toogle:MatDatepickerToggle<any>,
) {}
ngOnInit() {
if (this.control amp;amp; this.control.control)
this.control.control.disable()
if (this.button)
this.button.disabled=true
if (this.input)
this.input.disabled=true;
if (this.select)
this.select.disabled=true;
if (this.toogle)
this.toogle.disabled=true;
}
См. stackblitz