【问题标题】:Angular TypeError: Cannot read property 'users' of nullAngular TypeError:无法读取 null 的属性“用户”
【发布时间】:2020-06-25 14:18:58
【问题描述】:

我有一个组件通过 @Input() 装饰器接收关于组的数据。我的目标是在组件初始化期间根据组数组中的数据创建一个新的对象数组。这是我的 TS 组件部分:

import { Component, OnInit, Input } from '@angular/core';

import {Group} from "@models/group.model";

@Component({
  selector: 'app-group-admins',
  templateUrl: './group-admins.component.html',
  styleUrls: ['./group-admins.component.css']
})
export class GroupAdminsComponent implements OnInit {
  @Input() group: any = new Group();
  users: Array<object> = [];
  constructor() { }

  ngOnInit() {
    this.users = this.group.users.map((a: { user: number; permissions: number; }) => ({id: a.user, permissions: a.permissions}));
  }

  getUsers() {
    this.users = this.group.users.map((a: { user: number; permissions: number; }) => ({id: a.user, permissions: a.permissions}));
  }
}

这是我的 Group 和 GroupUser 模型(如果需要):

import {GroupUser} from "@models/group-user.model";

export class Group {
  group_name: string;
  type: string;
  avatar?: string;
  header?: string;
  address?: string;
  date?: string;
  city?: string;
  about?: string;
  verify_status?: string;
  site?: string;
  phone?: string;
  email?: string;
  web_site?: string;
  industry?: true;
  directions_list?: string;
  users: Array<GroupUser>
}

export class GroupUser {
  id?: number;
  user: number;
  permissions: string;
  confirmed?: boolean;
}

这是我的父 TS 组件部分:

group = [];
ngOnInit() {
this.route.paramMap.subscribe(() => {
  this.id = this.route.snapshot.paramMap.get("id");
  this.groupService.getSpecGroup(this.id).subscribe(
    ((info) => {
      this.group = info;
    })
  );
});
}

还有 HTML 部分:

 <app-group-admins [group]="group"></app-group-admins>

所以基本上我正在尝试通过 ngOnInit 创建用户数组,但它会引发错误 TypeError: Cannot read property 'users' of null 尽管如果我使用 getUsers() 函数一切正常。任何帮助将不胜感激。

【问题讨论】:

  • 组通过了吗?它说它是空的,所以我猜在 ngOnInit 执行的那一刻,this.group 是空的
  • 粘贴你的父组件和相应的 HTML 使用
  • 组已通过,因为getUsers() { this.users = this.group.users.map((a: { user: number; permissions: number; }) =&gt; ({id: a.user, permissions: a.permissions})); } 函数有效。我将在我的问题中添加父组件部分

标签: angular typescript


【解决方案1】:

为什么不在他的输入中使用setter? - 如果您不需要分组,则不需要存储在辅助变量中

  @Input() set group(value:Group){
    this.users=value && value.users?value.users..map((a: { user: number; permissions: number; }) => 
          ({id: a.user, permissions: a.permissions}));
        :[];
  }
  users: Array<object> = [];
  constructor() { }

【讨论】:

  • 抛出错误Property 'map' does not exist on type 'Group'.
  • 对不起是value.users,刚刚在代码中更正。我们还可以检查是否有值
  • 对不起,我不清楚你的代码,map() 前面有两个点,我没看懂这部分:[];
  • 我使用“条件运算符”:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。它只说variable=(condition)?valor1:valor2,即如果条件已满,变量取 valor1,否则取 valor2。在这种情况下,条件是value &amp;&amp; value.users,即value必须有任何值,而且必须有一个属性'users',并且这个属性必须有值
【解决方案2】:

@Input() group: any = new Group();

我觉得那行不合适。如果您将某些内容从父组件传递到子组件,则使用 @Input,并且不应重新初始化。

试试这个:

@Input('group') group: Group;
ngOnInit() {
  console.log(this.group);
}

【讨论】:

  • 感谢您的建议,但问题仍然存在
  • 在将您的代码更改为我编写的代码之后,子组件中的组是定义的还是未定义的?如果它是未定义的,那么它在父节点中也必须是未定义的。
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 2021-11-24
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多