【问题标题】:Angular cannot read property of undefinedAngular 无法读取未定义的属性
【发布时间】:2017-02-19 17:46:04
【问题描述】:

我收到以下错误

我是角度的新手,所以无法理解它的含义。有人可以解释一下这是什么意思吗?

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Response } from '@angular/http';

import { NgbActiveModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { EventManager, AlertService, LanguageService } from '../../util';

import { DataConfiguration } from './dataconfiguration.model';
import { DataConfigurationPopupService } from './dataconfiguration-popup.service';
import { DataConfigurationService } from './dataconfiguration.service';
@Component({
    selector: 'dp-dataconfiguration-dialog',
    templateUrl: './dataconfiguration-dialog.component.html'
})
export class DataConfigurationDialogComponent implements OnInit {

    dataConfiguration: DataConfiguration;
    authorities: any[];
    isSaving: boolean;

    constructor(
        public activeModal: NgbActiveModal,
        private languageService: LanguageService,
        private alertService: AlertService,
        private dataConfigurationService: DataConfigurationService,
        private eventManager: EventManager
    ) {
        this.languageService.setLocations(['dataconfiguration']);
    }

    ngOnInit() {
        this.isSaving = false;
        this.authorities = ['ROLE_USER', 'ROLE_ADMIN'];
    }
    clear () {
        this.activeModal.dismiss('cancel');
    }

    save () {
        this.isSaving = true;
        if (this.dataConfiguration.id !== undefined) {
            this.dataConfigurationService.update(this.dataConfiguration)
                .subscribe((res: DataConfiguration) => this.onSaveSuccess(res), (res: Response) => this.onSaveError(res.json()));
        } else {
            this.dataConfigurationService.create(this.dataConfiguration)
                .subscribe((res: DataConfiguration) => this.onSaveSuccess(res), (res: Response) => this.onSaveError(res.json()));
        }
    }

    private onSaveSuccess (result: DataConfiguration) {
        this.eventManager.broadcast({ name: 'dataconfigurationListModification', content: 'OK'});
        this.isSaving = false;
        this.activeModal.dismiss(result);
    }

    private onSaveError (error) {
        this.isSaving = false;
        this.onError(error);
    }

    private onError (error) {
        this.alertService.error(error.message, null, null);
    }
}

@Component({
    selector: 'dp-dataconfiguration-popup',
    template: ''
})
export class DataConfigurationPopupComponent implements OnInit, OnDestroy {

    modalRef: NgbModalRef;
    routeSub: any;

    constructor (
        private route: ActivatedRoute,
        private dataConfigurationPopupService: DataConfigurationPopupService
    ) {}

    ngOnInit() {
        this.routeSub = this.route.params.subscribe(params => {
            if ( params['id'] ) {
                this.modalRef = this.dataConfigurationPopupService
                    .open(DataConfigurationDialogComponent, params['id']);
            } else {
                this.modalRef = this.dataConfigurationPopupService
                    .open(DataConfigurationDialogComponent);
            }

        });
    }

    ngOnDestroy() {
        this.routeSub.unsubscribe();
    }
}

HTML

<form name="editForm" role="form" novalidate (ngSubmit)="save()" #editForm="ngForm">

    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"
                (click)="clear()">&times;</button>
        <h4 class="modal-title" id="myDataConfigurationLabel" dpTranslate="dataconfiguration.home.createOrEditLabel">Create or edit a DataConfiguration</h4>
    </div>
    <div class="modal-body">
        <dp-alert-error></dp-alert-error>
        <div class="form-group" [hidden]="!dataconfiguration.id">
            <label for="id" dpTranslate="global.field.id">ID</label>
            <input type="text" class="form-control" id="id" name="id"
                   [(ngModel)]="dataconfiguration.id" readonly />
        </div>
        <div class="form-group">
            <label class="form-control-label" dpTranslate="dataconfiguration.name" for="field_name">Name</label>
            <input type="text" class="form-control" name="name" id="field_name"
                [(ngModel)]="dataconfiguration.name"
            required minlength="3" />
            <div [hidden]="!(editForm.controls.name?.dirty && editForm.controls.name?.invalid)">
                <small class="form-text text-danger"
                   [hidden]="!editForm.controls.name?.errors?.required" dpTranslate="dataconfiguration.validation.required">
                   This field is required.
                </small>
                <small class="form-text text-danger"
                   [hidden]="!editForm.controls.name?.errors?.minlength" dpTranslate="dataconfiguration.validation.minlength" translateValues="{ min: 3 }">
                   This field is required to be at least 3 characters.
                </small>
            </div>
        </div>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal" (click)="clear()">
            <span class="fa fa-ban"></span>&nbsp;<span dpTranslate="dataconfiguration.action.cancel">Cancel</span>
        </button>
        <button type="submit" [disabled]="editForm.form.invalid || isSaving" class="btn btn-primary">
            <span class="fa fa-save"></span>&nbsp;<span dpTranslate="dataconfiguration.action.save">Save</span>
        </button>
    </div>
</form>

index.ts

export * from './tenant.model';
export * from './tenant-popup.service';
export * from './tenant.service';
export * from './tenant-dialog.component';
export * from './tenant-delete-dialog.component';
export * from './detail/tenant-detail.component';
export * from './tenant.component';
export * from './tenant.route';
export * from './configuration/dataconfiguration.service';
export * from './configuration/dataconfiguration-popup.service';
export * from './configuration/dataconfiguration-dialog.component';
export * from './configuration/dataconfiguration-delete-dialog.component';
export * from './configuration/detail/dataconfiguration-detail.component';

【问题讨论】:

  • 在第 15 行查看您的文件 index.ts。您正在尝试读取未定义变量的属性替换。
  • 您也可以发布您的 html 吗?
  • 更新相关文件中的代码,否则无法修复
  • @MilanRaval HTML 发布
  • 好的,找到问题了。在我的 route.ts 文件中,我尝试使用 dataConfiguration 而不是通过 dataconfiguration 导入。只是大写 C 造成了很大的差异 :))

标签: angular angular2-routing angular2-template


【解决方案1】:

请在您的整个项目中搜索替换,我猜其中一项服务在异步函数中有替换,该函数在您上面的源代码中调用,但位于其他位置。

当我在 Promise 中使用它时(由我的服务返回),我遇到了这些类型的错误。我刚刚得到 TypeErrors,直到我意识到我必须 var other = this;在返回新的 Promise 之前,并在整个 Promise 函数中使用 this 的其他内容。

【讨论】:

  • 有什么方法可以调试看看
  • 啊,我在上面的评论中看到了,您发现了问题,请发布完整的答案,而不仅仅是评论。
【解决方案2】:

好的,找到问题了。在我的 route.ts 文件中,我尝试使用 dataConfiguration 而不是通过 dataconfiguration 导入。只是大写 C 造成了很大的差异 :))

这意味着文件导入区分大小写,因此在导入时要小心。 不知何故,错误应该更简单。我从来不理解 javascript 错误。

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2016-01-12
    • 2015-09-08
    • 2016-05-12
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多