【问题标题】:Cannot read property 'UserName' of undefined in Angular 2无法读取 Angular 2 中未定义的属性“用户名”
【发布时间】:2018-09-26 01:24:00
【问题描述】:

为什么我在组件中定义了Cannot read property 'UserName' of undefined 的错误。在 html 代码中使用“elvis 运算符”并不能解决问题。请查看我在哪里出现此错误的代码:

user.model.ts

export class User {
    UserName: string;
    Password: string;
    Email: string;
    FirstName: string;
    LastName: string;
}

sign-up.component.ts

export class SignUpComponent implements OnInit {

  user: User;

  constructor() { }

  ngOnInit() {
  }

}

sign-up.component.html

<form class="col s12 white" #userRegistrationForm="ngForm">

<div class="row">
    <div class="input-field col s6">
        <input class="validate" type="text" name="UserName" #UserName="ngModel" [(ngModel)]="user.UserName" required  minlength="3">
        <label>Username</label>
    </div>

    <div class="input-field col s6">
    <input type="password" name="Password" #Password="ngModel" [(ngModel)]="user.Password"> 
    <label>Password</label>
    </div>
</div>

<div class="row">

</div>

</form>

使用 elvis 运算符: &lt;input class="validate" type="text" name="UserName" #UserName="ngModel" [(ngModel)]="user?.UserName" required minlength="3"&gt;

【问题讨论】:

标签: angular


【解决方案1】:

尽管根据最佳实践,您不应该这样做

在你的model.ts中,你可以初始化属性。

        export class User 
      {
        UserName: string="";
        Password: string="";
        Email: string="";
        FirstName: string="";
        LastName: string="";
      }

最佳方法是将用户注入您的组件。

providers:[User]

constructor(private user:User);

作为先决条件,您应该将您的班级装饰为@Injectable()

【讨论】:

  • 在定义文件中赋值是不好的做法
  • 请让我在投票前完成答案:)
  • 提供者用于服务,而不是接口/类
  • 类应该用于注入以使其松散耦合。 Provider 适用于您希望在组件中注入的任何内容。
  • 类只能在使用@Injectable()声明的情况下在构造函数注入中使用
【解决方案2】:

在声明时您是新模特。

而不是

user: User;

user: User = new User();

在 Angular 中将变量声明为模型的最佳做法是在声明时新建变量,但有时除外。

【讨论】:

  • 这是其他答案的副本
  • @mast3rd3mon 我没有复制任何东西,我写了正确的答案,当我看到你写的正确之后,我也投票赞成你的答案兄弟。无论如何,这是偶然的。请注意,堆栈不是战场,它只是程序员互相帮助的地方。
【解决方案3】:

你需要初始化用户对象,只需分配一个新的用户对象

user: User = new User();

【讨论】:

  • 这不起作用,因为类/接口中的所有值都是必需的,您必须为每个属性分配一个基值
  • 是的,你是对的,空对象意味着新的用户用户对象,我应该更具体
【解决方案4】:

看起来好像您正在使用export class User ...,您可以简单地使用user: User = new User();

【讨论】:

  • 这不是最佳实践,因为您使用的是紧密耦合代码的 new 运算符。使用用户作为服务并将其注入构造函数将是正确的方法。详情请查看我的回答。
  • 这不是最好的/正确的方式,提供者是为了在服务方面创建单例,而不是为了接口/类
  • 如果不是,那么您打算如何使类与组件不紧密耦合。这是关于我朋友的看法 :) 请阅读控制反转和依赖注入。
  • 我从来没有提到过耦合,我也不是你的朋友
  • 那么你应该在写代码的时候考虑耦合。这是最佳做法。
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 2021-11-04
  • 2018-12-18
  • 1970-01-01
  • 2018-04-15
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多