使用带下划线前缀的Angular API方法是否安全?

时间:2019-11-28 17:19:15

标签: angular angular-material

角材料paginator的方法以_开头。

_changePageSize(pageSize: number) {
    // Current page needs to be updated to reflect the new page size. Navigate to the page
    // containing the previous page's first item.
    const startIndex = this.pageIndex * this.pageSize;
    const previousPageIndex = this.pageIndex;

    this.pageIndex = Math.floor(startIndex / pageSize) || 0;
    this.pageSize = pageSize;
    this._emitPageEvent(previousPageIndex);
  }

此方法在Paginator API文档中没有列出。但是,它在诸如this之类的答案中被引用。

在同一分页器组件中,一种方法定义为私有,并且在IDE中不可用。

private _updateDisplayedPageSizeOptions() {
    if (!this._initialized) { return; }

    // If no page size is provided, use the first page size option or the default page size.
    if (!this.pageSize) {
      this._pageSize = this.pageSizeOptions.length != 0 ?
          this.pageSizeOptions[0] :
          DEFAULT_PAGE_SIZE;
    }

在AOT中,编译成功后会出错。

  

i「wdm」:编译成功。

ERROR in src/app/models/models.component.ts(153,22):
     

错误TS2341:属性“ _updateDisplayedPageSizeOptions”是私有的   并且只能在“ MatPaginator”类中访问。

我了解_的约定是Java语言中的私有方法,没有直接私有方法的概念。只需要更多信息:

  • 是不应该依赖的内部方法吗?
  • 在角度(或角度材料)中,以_开头的方法与常规方法有什么区别?
  • 如果它是changePageSize不是私有方法,为什么后缀_?如果是私有方法,为什么不将其标记为私有?这是矛盾之处还是我在这里丢失了?

2 个答案:

答案 0 :(得分:0)

是-下划线前缀是专用成员的通用编程约定。任何不属于公共API的内容都可能会在将来的版本(甚至是下一个版本)中更改或删除,因此并不可靠。公开的API更改至少应服从语义版本控制规则,并显示在更改日志中。

具有下划线前缀的函数与没有下划线前缀的函数之间没有区别。所关心的是组件及其功能等的预期用途,下划线用于标识不打算在组件外部使用的成员。

答案 1 :(得分:0)

如果您的问题是:“我应该在代码中做同样的事情吗?”然后不,使用private changePageSize(){...}-如果您担心安全性,请TypeScript帮助您,这就是它的目的。

如果您想了解约定,那么不建议使用此函数,因为API无法保证以相同的方式工作,甚至在将来的更新中都存在。