Angular 4中的类变量声明和访问

时间:2017-08-24 17:03:18

标签: angular http typescript model

我有以下型号:

export class User {
  email: string;
  token: string;
  username: string;
  bio: string;
  image: string;
  constructor() {}
}

当我尝试在另一个Typescript文件中实例化它时,它会抱怨它不能如下面的截图所示:

IDE screenshot

为什么我无法实例化这个并在此模型中设置所有属性的任何想法?

编辑:根据以下帖子的建议,我仍然无法修复它!这是截图!

enter image description here

2 个答案:

答案 0 :(得分:4)

不应在该上下文中使用关键字let。使用以下之一:

private payload = new User(); // if you don't want this accessible outside the class
public payload = new User(); // if class outsiders should access it directly

你问:

  

如何在实例化后在模型中设置属性?

正确的地方是组件ngOnInit lifecycle hook。这是Angular在组件初始化后(但在视图准备好之前)执行的代码

export class MyComponent implements OnInit {

  private someProperty:int;

  ngOnInit(){
    this.someProperty = 7;
  }
}

如果您还有很多工作要做,只需在ngOnInit内调用不同的初始化函数。在上面的代码中,您有一项服务。由于这不是组件,因此无法使用此生命周期钩子。如果您在编写代码时已经知道属性的值(从您的第二个屏幕截图中看起来就是这样),您可以直接设置它:

private payload:User = {
  email: '...',
  token: '...'
}

但是你可能不知道所有这些东西,它将被设置为一个函数的结果。然后,正确的方法是拥有一个初始化函数,您可以从将使用该服务的组件调用该函数。

@Injectable()
export class UserService {
  private isInitialized:boolean = false;
  private payload:User;

  public init(){
    // init() should only run once
    if(this.isInitialized) return;

    this.payload = new User();
    this.payload.email = '...';
    this.payload.token = this.someFunction();

    // to prevent init() from running again
    this.isInitialized = true;
  }

  private someFunction(){return 'token';}
}

然后在任何组件中,您需要做的就是在使用它之前调用this.userService.init()

注1:对于具有单个全局实例的服务,它必须列在主providers的{​​{1}}数组中,并且不会在其他任何位置提供。

注2:如果初始化涉及异步代码,例如从远程位置获取数据,则需要小心返回promise或Observable,并让代码等到它结算尝试使用该服务。

答案 1 :(得分:2)

您使用AppModule声明变量。尝试没有它。它只能用于在任何函数中声明函数作用域变量。在任何函数中,如

let

如果你想声明为类变量,可能就像

constructor() {
    let payload = new User();
}

声明后,可以在类的方法内的任何位置使用private payload: User = new User(); 关键字访问类变量,例如

this