TypeError: Невозможно прочитать имя свойства неопределенного TypeError: Невозможно прочитать имя свойства неопределенного

Я работаю с AngularJS и ядром .net. Обычно идея заключается в том, что с угловым я представляю данные и вызываю WebAPI из ядра .net. Представление данных не проблема, для публикации данных в настоящее время я не закончил, потому что у меня проблема с отображением формы, откуда я должен публиковать.

app.module.ts

import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './components/app/app.component'
import { HomeComponent } from './components/home/home.component';
import { HeaderComponent } from './components/shared/header/header.component';
import { SpareTypeListComponent } from './components/spareType/spare-type-list/spare-type-list.component';
import { SpareTypeSummaryComponent } from './components/spareType/spare-type-summary/spare-type-summary.component';
import { SpareTypeService } from "./components/shared/spare-type.service";
import { SpareTypeFormComponent } from './components/spareType/spare-type-form/spare-type-form.component';



export const sharedConfig: NgModule = {
    bootstrap: [ AppComponent ],
    declarations: [
        AppComponent,
        HeaderComponent,
        HomeComponent,
        SpareTypeListComponent,
        SpareTypeSummaryComponent,
        SpareTypeFormComponent
    ],
    imports: [
        BrowserModule,
        ReactiveFormsModule,
        FormsModule,
        HttpModule,
        RouterModule.forRoot([
            { path: '', redirectTo: 'home', pathMatch: 'full' },
            { path: 'home', component: HomeComponent },
            { path: 'spares', component: SpareTypeListComponent },
            { path: '**', redirectTo: 'home' }
        ])
    ],
    providers: [ SpareTypeService ]
};

запасной тип-form.component.ts

import { Component, OnInit, Input } from '@angular/core';
import { SpareType } from "../../shared/spare-type.type";
import { SpareTypeService } from '../../shared/spare-type.service';

@Component({
    selector: 'spare-form',
    templateUrl: './spare-type-form.component.html'

})

export class SpareTypeFormComponent implements OnInit {

    @Input() spareType: SpareType

    constructor(private spareTypeService: SpareTypeService) { }

    ngOnInit() {

    }

    onSubmit() {

    }
}

запасной тип-form.component.html

<form (ngSubmit)="onSubmit()" #spareTypeForm="ngForm">

        <label for="name">Name:</label>
        <input type="text" class="form-control" name="name" [(ngModel)]="spareType.name" required #name="ngModel" />
        <br />
        <button type="submit" class="btn btn-success btn-lg">Add</button>
</form>

Ошибка

Если я из входного тега удалить форму [(ngModel)]="spareType.name" required #name="ngModel" отображается на странице без каких-либо проблем. Где я ошибся?

Я следую этому примеру: https://github.com/Vintharas/angular2-step-by-step-05-forms-and-validation/tree/master/src/app/person-details

Где он инициализирует пустой объект?

Родительский компонент

import { Component, OnInit, Input} from '@angular/core';
import { SpareType } from '../../shared/spare-type.type';
import { SpareTypeService } from "../../shared/spare-type.service";

список запасных типов.component.ts

@Component({
    selector: 'spare-type-list',
    templateUrl: './spare-type-list.component.html',
    providers: [SpareTypeService]

})

export class SpareTypeListComponent implements OnInit {


    @Input() spareType: SpareType;

    spareTypes: SpareType[];

    constructor(private spareTypeService: SpareTypeService ) {

    }

    ngOnInit() {
        this.spareTypeService.getSpareTypes()
            .then(types => this.spareTypes = types);
    }
}

список запасных типов.component.html

<spare-form></spare-form>
<h1>Spare Types List</h1>
<p *ngIf="!spareTypes">No Spare Types Found.</p>
<spare-type-summary *ngFor="let spareType of spareTypes" [spareType]="spareType"></spare-type-summary>

Отображение данных из базы данных работает, только у меня проблема с формой.


person Danijel Boksan    schedule 21.07.2017    source источник
comment
вы можете инициализировать spareType в своем компоненте как пустой объект, чтобы он не был undefined или null при отображении шаблона.   -  person AJT82    schedule 21.07.2017
comment
Пожалуйста, проверьте мое обновление.   -  person Danijel Boksan    schedule 21.07.2017
comment
Я бы инициализировал его в родительском компоненте, где у вас есть переменная для вашего ребенка @Input, то есть spareType.   -  person AJT82    schedule 21.07.2017
comment
Пожалуйста, проверьте обновление.   -  person Danijel Boksan    schedule 21.07.2017
comment
Ну, вы не передаете spareType компоненту формы в дочернем теге. И откуда берется этот spareType, он у вас тоже есть на входе в родителях?   -  person AJT82    schedule 21.07.2017
comment
@ AJT_82: это происходит отсюда: ‹запасной-тип-резюме *ngFor=пусть запасной тип запасных типов [запаснойтип]=запаснойтип›‹/запасной-тип-резюме›   -  person Sandip - Frontend Developer    schedule 21.07.2017
comment
Да, но вы ничего не передаете <spare-form>, и у вас не должно быть @Input в родительском компоненте, если это источник spareType.   -  person AJT82    schedule 21.07.2017


Ответы (1)


Определите свою переменную spareType, как показано ниже, кажется, что ваше представление отображается, в то время как значение вашего объекта равно null, поэтому вы не можете получить доступ к свойству name объекта spareType

@Input() spareType: SpareType = new SpareType();

Вы также можете обновить событие объекта ngOnChange.

ngOnChanges(changes: any) {
    if (changes.spareType != null && changes.spareType.currentValue == null) {
          this.spareType=new SpareType();
    }       
}

Примечание. Как предложил @AJT_82: "сделать это в родительском компоненте" - лучший подход.

person Sandip - Frontend Developer    schedule 21.07.2017
comment
Вот ошибка: ОШИБКА в [at-loader]./ClientApp/app/components/spareType/spare-type-form/spare-type-form.component.ts:13:5 TS2322: тип '{}' не назначаемый для типа «SpareType». Свойство 'id' отсутствует в типе '{}'. - person Danijel Boksan; 21.07.2017
comment
я обновляю свой код с помощью вашего в Spare-Type-form.component.ts и проблема все еще присутствует. - person Danijel Boksan; 21.07.2017
comment
назначьте новый объект SpareType() при определении - person Sandip - Frontend Developer; 21.07.2017