Если в теге формы используется ngModel, должен быть установлен атрибут name - PullRequest
0 голосов
/ 01 ноября 2019

Итак, у меня есть страница, где я буду создавать нового пользователя, и я пытаюсь добавить возможность указать, к какой группе будет принадлежать этот пользователь. Я отметил код как полужирный внутри функции onSubmit, чтобы вы могли видеть его, этот код проверит, какая группа была проверена, и установит членство для этого нового использования. Поэтому, чтобы мое приложение могло знать, какая группа была проверена, я использовал привязку данных в html [(ngModel)]="item.Selected" и пометил этот фрагмент кода как полужирный, чтобы вы могли найти его. Но это не работает и выдает ошибку, которую я прикрепил как скриншот. Спасибо!

<div class="tab">

    <h2>Add New User</h2>

    <form (ngSubmit)="onSubmit(addNewUserForm)" #addNewUserForm="ngForm" [hidden]="Error!=null">

        <mat-card>

            <div class="form-group">

                <label for="name"><b>Name</b></label>

                <div>

                    <input autocomplete="off" type="text" id="name" required [(ngModel)]="user.name" name="name"
                        #name="ngModel">

                    <div [hidden]="name.valid" class="alert alert-danger">Name is required</div>

                </div>

            </div>

            <div class="form-group">

                <label for="password"><b>Password</b></label>

                <div>

                    <input type="password" id="password" [(ngModel)]="user.password" name="password"
                        #password="ngModel">

                    <div [hidden]="!passwordEmpty(addNewUserForm)" class="alert alert-warning">Blank password is not
                        recommended</div>

                </div>

            </div>

            <div class="form-group">

                <label for="password2"><b>Retype Password</b></label>

                <div>

                    <input type="password" id="password2" [(ngModel)]="user.password2" name="password2"
                        #password2="ngModel">

                    <div [hidden]="passMatch(addNewUserForm)" class="alert alert-danger">Password does not match</div>

                </div>

            </div>

            <div class="form-group-groups">

                <label><b>Select group</b></label>
            </div>

            <mat-form-field style="min-width: 290px; margin-left: 1em;">

                <mat-select multiple>

                 **<mat-option *ngFor="let item of items" [(ngModel)]="item.Selected">{{item.Name}}</mat-option>**

                </mat-select>

            </mat-form-field>

        </mat-card>

        <mat-card>

            <button mat-raised-button class="lspace" [disabled]="!formValid(addNewUserForm)">Add</button>
            <button mat-raised-button class="lspace" (click)="onCancel()">Cancel</button>

        </mat-card>

    </form>

    <div>

        <p class="error" *ngIf="Error != null">{{Error}}</p>

    </div>

</div>

export class UserDetails {
    name: string;
    password: string;
    password2: string;
}

export module Model {
    export class GroupItem {
        constructor(group: Group) {
            this.Name = group.Name;
            this.Selected;
        }

        readonly Name: string;
        Selected: boolean;
    }
}

@Component({
    selector: 'new-user',
    templateUrl: './user-new.component.html',
    styleUrls: ['./user-new.component.css'],
})

export class NewUserComponent extends BaseComponent implements OnInit {
    user: UserDetails;
    Groups: Group[];
    items: Model.GroupItem[];

    constructor(appData: AppData, private userService: UsersService, logonService: LogonService, private location: Location, private groupService: GroupsService) {
        super(appData, logonService);
        this.user = new UserDetails();
    }


    protected onToken(token: string): void {
        this.fetchGroups(token);
    }

    private fetchGroups(token: string): void {
        this.groupService.getGroups(token).subscribe(
            groups => { this.buildItems(groups) },
            (err: any) => { this.showError(err) }
        );
    }

    private buildItems(groups: Group[]): void {
        this.items = new Array<Model.GroupItem>(groups.length);
        for(let i=0; i < groups.length; ++i) {
            this.items[i] = new Model.GroupItem(groups[i]);
        }
    }

    ngOnInit() {
        super.ngOnInit();
        document.getElementById('name').focus();
    }

    onCancel(): void {
        super.ngOnInit();
        this.location.back();
    }

    passMatch(form: NgForm): boolean {
        let p1 = (form.value.password == null) ? '' : form.value.password;
        let p2 = (form.value.password2 == null) ? '' : form.value.password2;
        return (p1 == p2);
    }

    formValid(form: NgForm): boolean {
        return form.valid && this.passMatch(form);
    }

    passwordEmpty(form: NgForm): boolean {
        return (form.value.password == null) || (form.value.password.length == 0);
    }

    onSubmit(form: NgForm): void {
        if (this.Token == null || this.Token == '') {
            console.error('Token is not valid.');
            return;
        }

        **var groups: string[] = this.items.filter(itm => itm.Selected).map(itm => itm.Name);
        this.userService.setMembership(this.Token, this.user.name, groups).subscribe(
            () => { this.location.back(); this.appData.setDirty(); },
            (err: any) => { this.showError(err) }
        );**
        //
        let pass = (this.user.password == '') ? null : this.user.password;
        this.userService.addUser(this.Token, this.user.name, pass).subscribe(
            (_: string) => { this.location.back(); this.appData.setDirty(); },
            (err: any) => { this.showError(err); }
        );
    }
}

Мое приложение с ошибкой, которую я получаю

1 Ответ

0 голосов
/ 01 ноября 2019

У вас нет атрибута name на вашем mat-select, и то, как вы используете mat-select, выглядит немного не так. Ваша модель, вероятно, должна быть на mat-select, но я должен увидеть, как выглядит ваш предмет. Вы хотите что-то ближе к этому, хотя я верю:

<mat-select multiple [(ngModel)]="selectedItem">
**<mat-option *ngFor="let item of items" [value]="item.id">{{item.Name}}</mat-option>**
</mat-select>

...