2016-06-01 20 views
6

Buduję formularz z ControlGroup i ładuję obiekt klasy w nim. Jednak napotykam błąd wspomniany w tytule w połowie czasu. Niektóre formularze ładują się, a niektóre nie.Angular 2 Maszynopis: TypeError: this.validator nie jest funkcją

Mam plik klasy tak:

export class User { 
    id: number; 
    email: string; 
    sign_in_count: number; 
    created_at: string; 
    first_name: string; 
    last_name: string; 
    birth_date: Date; 
    news_letter: boolean; 
    fb_id: string; 
    gender: boolean; 
    phone: string; 
    picture: any; 
} 

W moim UserDetailComponent załadować klasę w kontroli jak ten:

export class UserDetailComponent implements OnInit { 
    user: User; 
    userDetailForm: ControlGroup; 

    constructor(
     private form: FormBuilder, 
     private _userService: UserService, 
     private _router: Router, 
     private params: RouteSegment 
    ) { } 
    ngOnInit() { 
     this.user = this._userService.getUser(); 
     if (this.user === undefined) { 
      this._userService.getSingleUser(this.params.getParam('id')) 
       .subscribe(data => (this.user = data, this.setForm())); 
     } else { 
      this.setForm(); 
     } 
    } 

    setForm() { 
     this.userDetailForm = this.form.group(this.user); 
    } 
} 

Na tym ostatnim wierszu pojawia się błąd, którego stacktrace jest poniżej:

browser_adapter.ts:78 TypeError: this.validator is not a function 
    at Control.AbstractControl._runValidator (model.ts:146) 
    at Control.AbstractControl.updateValueAndValidity (model.ts:128) 
    at new Control (model.ts:282) 
    at FormBuilder.control (form_builder.ts:32) 
    at FormBuilder._createControl (form_builder.ts:66) 
    at eval (form_builder.ts:50) 
    at Function.StringMapWrapper.forEach (collection.ts:132) 
    at FormBuilder._reduceControls (form_builder.ts:49) 
    at FormBuilder.group (form_builder.ts:19) 
    at UserDetailComponent.setForm (user-detail.component.ts:95) 
+1

Może być konieczne utworzenie formularza w konstruktorze i zaktualizowanie wartości (lub dodanie/usunięcie elementów) tylko wtedy, gdy dotrą dane z 'UserService'. –

+0

Co to jest FormBuilder? Czy to jest import? –

+0

@StianStandahl tak to jest import @ kątowy/wspólny - https://angular.io/docs/ts/latest/api/common/FormBuilder-class.html – Ruben

Odpowiedz

1

Utwórz formularz w konstruktorze. Gdy Angular nie znajdzie formularza przy pierwszej próbie rozwiązania powiązań, to nie działa.

this.userDetailForm wystarczy, że zostanie zainicjalizowany z pustą grupą lub kilkoma kontrolkami statycznymi. Następnie, gdy dane nadejdą z serwera, zaktualizuj grupę, dodając/usuwając kontrolki i aktualizując wartości.

23

Miałem ten błąd, gdy wiązałem tablicę wartości w narzędziu do tworzenia formularzy w niewłaściwy sposób.

Co zrobiłem:

fb.group({items: [1, 2, 3, 4]}) 

Jak powinno być:

fb.group({items: [[1, 2, 3, 4]]}) 

Trzeba zawinąć wszystko do tablicy, w przeciwnym razie kątowe uważa, że ​​[1, 2, 3, 4] jest kontrola forma Definicja:, a nie wartość kontrolna formularza.

+0

To! Działa jak smakołyk, a niech Angular zarządza samymi modelami bez konieczności pisania więcej kodu (przy ryzyku, że ten dodatkowy kod stanie się nieaktualny/wymagający testowania). Lepszy sposób na rozwiązanie tego problemu IMO. –

+0

Ah! Oczywiście, jeśli jest to tablica, oczekuje drugiej wartości jako walidatora. Mógłbym zabrać mnie na wieki, żeby to wytropić. – Joe

Powiązane problemy