Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 是否有办法限制对组件和它的方法/变量访问';什么样的模板?_Angular_Typescript - Fatal编程技术网

Angular 是否有办法限制对组件和它的方法/变量访问';什么样的模板?

Angular 是否有办法限制对组件和它的方法/变量访问';什么样的模板?,angular,typescript,Angular,Typescript,当我使用@ViewChild访问childcomponent时,我可以访问它的所有公共方法。但是,其中一些方法是专门为模板交互而编写的,不应该对另一个(父)组件进行访问。您需要将变量/方法设置为public,以便模板能够使用它们,但这样做也会破坏封装 有没有人知道如何将变量/方法访问限制为只访问组件、模板和测试?例如,像Java中的包私有修饰符 在下面的代码中,父组件可以通过@ViewChild(TestComponent)访问该组件,然后调用TestComponent.showMessage$

当我使用@ViewChild访问childcomponent时,我可以访问它的所有公共方法。但是,其中一些方法是专门为模板交互而编写的,不应该对另一个(父)组件进行访问。您需要将变量/方法设置为public,以便模板能够使用它们,但这样做也会破坏封装

有没有人知道如何将变量/方法访问限制为只访问组件、模板和测试?例如,像Java中的包私有修饰符

在下面的代码中,父组件可以通过@ViewChild(TestComponent)访问该组件,然后调用
TestComponent.showMessage$.next('完全不相关的东西')
。我如何定义这是我不想公开的功能

@Component({
  selector: 'app-aanvraag',
  template: `
    <div *ngIf="showMessage$ | async as message">
      {{message}}
    </div>`,
  styleUrls: ['./aanvraag.component.scss']
})
export class TestComponent {
  showMessage$ = new BehaviorSubject('Some message');

  constructor() {
  }
}

@组件({
选择器:“应用程序aanvraag”,
模板:`
{{message}}
`,
样式URL:['./aanvraag.component.scss']
})
导出类TestComponent{
showMessage$=新行为主体(“某些消息”);
构造函数(){
}
}

在您的特定示例中,您可以使用
asObservable()
。这确保组件之外的任何东西都不能调用
next()
。尽管这样做也会使您无法从模板中调用它

不幸的是,无法使它仅在模板中可用,也无法用于可能访问该实例的任何其他代码段。我记得两年前,当他们在angular编译器中添加check时,我将模板中使用的所有属性设置为
private
。把它们都公之于众是件大事

对于更具描述性的代码,您可以使模板中使用的内容不具有访问标识符,并且可以添加
public
属性。这不会阻止访问,但会让它更加清晰

您还可以查看
只读
访问标识符。这防止任何东西重新分配所述财产:

@Component({
  selector: 'app-aanvraag',
  template: `
    <div *ngIf="showMessage$ | async as message">
      {{message}}
    </div>`,
  styleUrls: ['./aanvraag.component.scss']
})
export class TestComponent {
  private readonly showMessage = new BehaviorSubject('Some message');

  readonly showMessage$ = this.showMessage.asObservable();

  constructor() {
  }

  newMessage(message: string): void {
    this.showMessage.next(message);
  } 
}
出于代码质量的原因,一个小建议是,在组件和模板中使用英语命名

export class TestComponent {
  get message(): string {
    return this._message;
  }

  private message: string = '';
}