ОШИБКА TypeError: this.user.setPassword не является функцией в angular 5? - PullRequest
0 голосов
/ 25 июня 2018

Работая с простым приложением angular5 в передней части, я хочу сделать редактирование профиля когда пользователи хотят, поэтому у меня есть кнопка настройки, связанные с компонентом ParametresComponent.

Сначала я показываю информацию о пользователе с помощью функции get UserInfo (), после чего, когда пользователь заканчивает модификацию своей учетной записи, он может сохранить изменения (он может изменять только «Tel» и «password»).

Итак, у меня есть класс Model User.ts:

export class  User{

  id:number;
  username:string;
  password:string;
  prenom:string;
  nom:string;
  tel:string;
  cin:string ;

  setId(value: number) {
    this.id = value;
  }

  setUsername(value: string) {
    this.username = value;
  }

  setPassword(value: string) {
    this.password = value;
  }

  setPrenom(value: string) {
    this.prenom = value;
  }

  setNom(value: string) {
    this.nom = value;
  }

  setTel(value: string) {
    this.tel = value;
  }

  setCin(value: string) {
    this.cin = value;
  }



}

ПараметрComponent.component.ts

import { Component, OnInit } from '@angular/core';
    import * as _swal from 'sweetalert';
    import { SweetAlert } from 'sweetalert/typings/core';
    import {AbstractControl, FormBuilder, FormGroup, Validators} from '@angular/forms';
    import {ActivatedRoute, Router} from '@angular/router';
    import {User} from '../Admin/Models/User';
    import {Devloppeur} from '../Admin/Models/Devloppeur';
    import {DevloppeurService} from '../../../service/devloppeur.service';
    import {ClientService} from '../../../service/client.service';
    import {AuthenticationService} from '../../../service/authentication.service';
    const swal: SweetAlert = _swal as any;

    function passwordMatch(control: AbstractControl):{[key: string]: boolean}{

      const password = control.get('password');
      const Confirmationpassword = control.get('Confirmationpassword');

      if( !password || !Confirmationpassword) {
        return null; }

      if(password.value === Confirmationpassword.value){
        return null;
      }

      return {
        mismatch:true
      }

    }

    @Component({
      selector: 'app-parametres',
      templateUrl: './parametres.component.html',
      styleUrls: ['./parametres.component.scss']
    })
    export class ParametresComponent implements OnInit {

      form: FormGroup;
      user:User  = new User();
      id:number;
      constructor(private formBuilder: FormBuilder,
                  public router:Router,
                  private authService:AuthenticationService,
                  public activatedRoute:ActivatedRoute,
                  private devService:DevloppeurService,
                  private clientServ:ClientService) { }

      ngOnInit() {
        this.id = this.authService.getAuthenticatedUserId();
        this.getUserInfo();

        this.form = this.formBuilder.group({
          prenom: [''] ,
          nom: [''],
          tel: ['', Validators.required],
          cin: [''],
          username : [''],
          passwordG: this.formBuilder.group({
            password: ['',[Validators.required,Validators.minLength(9)]],
            Confirmationpassword : ['',[Validators.required,Validators.minLength(9)]]

          }, {validator: passwordMatch})

        });
      }

      getUserInfo(){
        this.clientServ.getUser(this.id)
          .subscribe((data:any)=>{
            this.user = data;
          },err=>{
            console.log('there is an error lady ! ');
          })

      }


      SaveEditUser(){
        this.user.setPassword(this.form.value.passwordG.password);
        this.user.setTel(this.form.value.tel);


        this.devService.saveUser(this.user)
          .subscribe((data:User)=>{
            swal("operation réussi !", "Great edited with success !", "success");
            this.router.navigate([ '/profil' ], { relativeTo: this.activatedRoute });
          },err=>{
            console.log(err);
          })
      }


    }

И параметры.Component.html:

<div >
  <div class="col-sm-10">
    <div class="card">
      <div class="card-header">
        <strong>Modifier mon profil</strong>
      </div>

      <form [formGroup]="form" (ngSubmit)="SaveEditUser()">

        <div class="card-body">
          <div class="form-group">
            <label for="company">Prenom</label>
            <input type="text" class="form-control" id="company" disabled [(ngModel)]="user.prenom"  formControlName="prenom"/>
          </div>
          <div class="form-group">
            <label for="vat">Nom</label>
            <input type="text" class="form-control" id="vat"  disabled [(ngModel)]="user.nom"   formControlName="nom" />
          </div>
          <div class="form-group">
            <label for="vat">Tel</label>
            <input type="number" class="form-control" id="vat"  [(ngModel)]="user.tel"  formControlName="tel" />
          </div>
          <div class="form-group">
            <label for="vat">Cin</label>
            <input type="text" class="form-control" id="vat"   disabled [(ngModel)]="user.cin"  formControlName="cin" />
          </div>
          <div class="form-group">
            <label for="vat">Email</label>
            <input type="text" class="form-control" id="vat"   disabled [(ngModel)]="user.username"  formControlName="username" />
            <div class="error" *ngIf="form.controls['username'].invalid && form.controls['username'].errors.required && (form.controls['username'].dirty || form.controls['username'].touched)">Please enter an email</div>
            <div class="error" *ngIf="form.controls['username'].invalid && form.controls['username'].errors.email && (form.controls['username'].dirty || form.controls['username'].touched)">Please enter a valid email</div>
            <div class="error" *ngIf="form.controls['username'].invalid && form.controls['username'].errors.emailTaken">This email has been taken, please use another one.</div>
          </div>


          <div formGroupName = "passwordG">

            <div class="form-group">
              <label for="vat">Password</label>
              <input type="password" class="form-control" id="vat"    formControlName="password" />
            </div>

            <div class="form-group">
              <label for="vat">Confirmation Password</label>
              <input type="password" class="form-control" id="vat" formControlName="Confirmationpassword" />
            </div>


            <div *ngIf="(form.controls['passwordG'].invalid && form.controls['passwordG'].touched)" class="col-sm-3 text-danger">

              <ng-container *ngIf="form.controls['passwordG'].errors?.mismatch;
                then first else second"> </ng-container>

              <ng-template #first>
                Password do not match </ng-template>

              <ng-template #second>
                Password needs to be more than 8 characters
              </ng-template>
            </div>

          </div>

        </div>
        <div class="card-footer">
          <button type="submit" class="btn btn-sm btn-primary" [disabled] = "!form.valid"><i class="fa fa-dot-circle-o"></i>Enregistrer Les modifications</button>
        </div>
      </form>
    </div>
  </div><!--/.col-->
</div>

Проблема при сохранении, я получаю эту ошибку:

ParametresComponent.html:8 ERROR TypeError: this.user.setPassword is not a function
    at ParametresComponent.SaveEditUser (parametres.component.ts:79)
    at Object.eval [as handleEvent] (ParametresComponent.html:8)
    at handleEvent (core.js:13530)
    at callWithDebugContext (core.js:15039)
    at Object.debugHandleEvent [as handleEvent] (core.js:14626)
    at dispatchEvent (core.js:9945)
    at eval (core.js:12284)
    at SafeSubscriber.schedulerFn [as _next] (core.js)

Я не могу понять, почему я получаю эту ошибку? любая идея ?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

У меня есть два предложения:
1) Попробуйте добавить конструктор в User.
2) В getUserInfo () попытайтесь сохранить объект как тип пользователя

getUserInfo(){
        this.clientServ.getUser(this.id)
          .subscribe((data:any)=>{
            this.user = data; // <-- this.user = data as User;
          },err=>{
            console.log('there is an error lady ! ');
          })
      }
0 голосов
/ 25 июня 2018

Вы присваиваете объект, полученный из вашего API, вашему this.user объекту.Это означает, что ваш новый пользовательский объект больше не относится к типу User, поскольку вы не можете передавать методы для объекта, который вы получаете от API.Если вы хотите присвоить объект из API вашему this.user, вы должны сохранить исходный this.user, который вызвал new User (таким образом создавая методы на прототипе объекта).Для этого вам следует назначить свойства объекта API, а не сам объект:

getUserInfo(){
  this.clientServ.getUser(this.id)
    .subscribe((data:any)=>{
      Object.assign(this.user, data);
    },err=>{
      console.log('there is an error lady ! ');
    });
}
0 голосов
/ 25 июня 2018

Попробуйте установить общедоступный спецификатор доступа для всех ваших методов,

public setPassword(value: string) {
    this.password = value;
}
...