typescript – Angular2 @Inputs应该是公共的还是可以/我们应该
我正在使用带有Typescript的Angular2
假设我的app组件模板中有以下内容: ... <coffee-cup [coffee]="" ... 我的咖啡杯组件: @Component({ selector: 'coffee-cup',... }) export class CoffeeCup { @Input() public coffee = 0; } 我目前不确定我的输入应该是什么样子.它可能看起来像这样: @Input() public coffee = 0; 要么 @Input() private coffee = 0; 我目前倾向于将成员变量咖啡私有化. >我想为组件定义一个清晰的公共API 我查看组件的方式是有两个单独的API与之交互: >模板API,由@Inputs和@Outputs组成 我没有检查在下列情况下发生了什么,但是,它可能会改变答案: >假设咖啡成员是公开的.如果我的appComponent使用@ViewChild访问CoffeeCup并设置咖啡成员,生命周期挂钩(如ngOnChange)会触发吗? 重申一下这个问题:Angular2 @Inputs应该是公开的,还是应该通过将它们设为私有来实现更严格的API? 解决方法
首先,从API设计的角度来看,@ Input意味着公开.从角度来看也是如此,这些装饰器描述了与组件交互的接口.
@Input装饰器或任何其他元装饰器由角度使用,让角度知道您的意图,并更好地理解模板及其与组件类的关系. 在某些情况下,它也被变化检测引擎使用.例如,@ Input是由更改检测跟踪的字段,它向CD引擎提示应该监视此属性. 拥有带@Input装饰器的私有属性不应该在运行时有任何影响.这个修饰符是虚拟的,它在TypeScript到JavaScript编译后消失了. 但是,根据您的环境,可能会出现一些影响: 一般来说,使用TypeScript和元数据的一大好处就是拥有一个智能IDE,这意味着IDE可以在您编写代码时为您提供帮助.拥有私有属性可能会也可能不会影响它,具体取决于每个IDE的实现. 另一个风险因素是未来对打字稿中的缩小/丑化的支持. 需要考虑的另一点是,虽然angular不关心编译器所做的修饰符,但动态组件创建将受到限制.
这也回答了关于在父/子组件上访问这些属性以获取对咖啡组件的引用的问题.只能通过模板标记进行绑定.例如,您将无法手动注册到咖啡组件上注册的EventEmitters.这有时是必需的,请参见THIS场景作为一个示例. 至于生命周期钩,它不应该有任何影响,因为角度不检查类型,但进行存在检查. 因此,总而言之,在大多数用例中你不应该有任何问题,但随着你的应用程序的进展,你可能会解决一些问题,或者没有.您可能还需要在将来选择退出高级缩小功能…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |