游戏机本身就是一个黑盒模型,我们看不到游戏机内部是如何运转的,只暴露两个手柄,不关心游戏机谁来恩手柄,游戏机只关心一件事,摁A显示什么,摁B显示什么。就像它不关心谁摁手柄输入信息,也不关心谁看屏幕输出,甚至有没有看都无所谓。 规定输入的格式(手柄),输出外面可能会感兴趣的东西。
我们的组件就是要设定成一个黑盒模型,如果一个组件要从外部接收一些东西,应该用输入属性声明它需要的东西,至于这些东西从哪里来,组件不需要知道。只需要知道需要的东西外部提供之后需要怎么做,一个组件 想把外部世界可能感兴趣的东西告诉外部世界,应该通过输出属性来设事件,至于这些事件发射给谁,组件也不需要知道,那些对组件发射东西感兴趣的东西应该自己来订阅组件发射的事件。
组件的输入属性是指被input装饰器注解的属性,用来从父组件接收数据。
场景很简单,在父组件里输入我想买的股票的名字,通过输入属性,传给子组件,子组件显示出来
步骤1:ng g component order ;
在order子组件里定义输入属性
/*输入属性等着父组件给它传值*/
@Input()
stockCode: string; // 股票代码
@Input()
amount: number; // 股票数量
步骤2:order组件的html
<p>子组件</p>
<div>买{{amount}}手{{stockCode}}股票</div>
步骤3: 父组件app.component.ts中定义stock
stock: ''; // 输入的股票代码默认是一个空的就可以
步骤4: app.component.html
<p>父组件</p>
<!--双向绑定,输入框输入会改变stock的值,-->
<input type="text" placeholder="请输入股票代码" [(ngModel)]='stock'>
<app-order [stockCode]="stock" [amount]="100"></app-order>
<!--展示子组件的内容,父组件的stock属性通过输入属性传给子组件的stockCode.-->
效果:注意:
1.一定记得写input装饰器
2.属性绑定是单向的, 只能父组件值改变影响子组件,子组件改变值,不会影响父组件。
constructor() {
setInterval(() => {
this.stockCode = 'Apple';
}, 3000);
}
效果:比较下输入属性和路由传递参数传递
输入属性:是通过属性来传递数据的,这种传递只能在由父子关系的组件间从父组件给子组件传递数据。(父组件模板引用另一个形成的父子组件关系才能传递)
路由参数:我们是通过构造函数传递的,在构造函数依赖注入一个ActivatedRoute这样类型的对象进来,通过这个对象的参数快照或参数订阅来获取外面传入的参数。通过路由来往组件里传递数据。