2016-09-15 12 views
19

Aż do „final” 2,0 kątowego Zrobiłem to:kątowa 2: Wyłącz zmianę sygnału wejściowego nie działa

<input type="text" formControlName="name" [disabled]="!showName"> 

Aby dynamicznie włączyć/wyłączyć wejść formularza.

Po uaktualnieniu z RC7 do 2,0 ja dostać to ostrzeżenie w oknie konsoli:

It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid 'changed after checked' errors.

ja zmieniłem kod do tych instrukcji jak to:

this._userGroupUsersForm = this._formBuilder.group({ 
     'users': [{'', disabled: this.showName}, Validators.compose([Validators.required, Validators.minLength(3), Validators.maxLength(50), Validators.pattern("^[a-zA-ZåäöÅÄÖ 0-9_-]+$")])] 
    }); 

i że działa dobrze dla początkowe ładowanie strony, ale nie mogę już zmieniać stanu w następujący sposób:

toggleName() : void { this.showName = !this.showName; } 

Jak rozwiązać ten problem?

Uwaga: Mój "stary" sposób robienia tego (przez ustawienie [wyłączone]) również nie działa.

Odpowiedz

19

To powinno działać

toggleName() : void { 
    let ctrl = this.form.get('name') 
    ctrl.enabled ? ctrl.disable() : ctrl.enable() 
} 
+1

To prawda! Jesteś niesamowity, proszę pana. Dziękuję Ci! To jednak nadal narzeka na przycisk przesyłania, który wygląda tak: '

+0

Skarżyć się na co. Czy możesz podać dokładny błąd? –

+0

Przepraszam za to. Jest to dokładnie ten sam komunikat o błędzie, co poprzednio. Wydaje mi się, że wygląda na wszystkich [niepełnosprawnych] i pokazuje to? –

27

Ten sam problem spowodował, że wyciągnąłem włosy. Moim rozwiązaniem było użycie interpolacji zamiast jednokierunkowej do aktualizacji właściwości. W twoim przypadku, zamiast użycia:

<input type="text" formControlName="name" [disabled]="!showName">

można zrobić:

<input type="text" formControlName="name" disabled="{{!showName}}">

Tak szybko, jak to zrobiłem, byłem w stanie dynamicznie włączyć/wyłączyć elementy w moich postaciach.

Mam nadzieję, że to pomoże!

+0

To nie kompiluje się w Anglar 4: 'Błąd analizatora: Mam interpolację ({{}}), gdzie oczekiwano wyrażenia" – FelixM

+0

Wygląda na to, że możesz wykonywać [disabled] = "{{interpolacja}}". Umysł dostarczający próbkę twojego kodu? Dzięki! –

17

Możesz spróbować użyć atrybutu readonly w swoich danych wejściowych.

niepełnosprawnych >>> readonly

<input type="text" formControlName="name" [readonly]="!showName">

3

Jeśli ktoś przewija się przez to i przyjął odpowiedź (Gunters) nie działa, ponieważ nie zrobił dla mnie na początku. Możliwe, że próbujesz użyć go z komponentem niestandardowym i nie wdrożyłeś opcjonalnej metody setDisabledState(isDisabled: boolean) z interfejsu ControlValueAccessor.

+1

przy użyciu niestandardowego składnika (dla różnych typów pól) propagujących zmiany (rozszerza ControlValueAccessor). Próbowałem interpolacji, jak w poprzednim komentarzu, ale twoje rozwiązanie było w moim przypadku, co działało, wydaje się praktyczne, po prostu zaktualizowano sposób tworzenia kontroli formularza (jawny konstruktor z wyłączonym atrybutem) i dodano metodę setdisabledStatus, która ustawia wewnętrzną wyłączoną właściwość mojego komponentu niestandardowego. dzięki. – kandan

Powiązane problemy