Angular的模块间通信的模块间通信
关键点
Angular是用基于模块的应用程序架构构建的,所以是有可能在模块之间传输数据的;
你可以通过@Input()把数据传入子模块;
你可以通过@Output()从子模块捕获数据;
随着应用程序的发展,父子模块之间的通信会越来越困难;
你可以通过ngrx之类的方法用外部数据库来构建大规模应用程序;
模块是Angular的构建单元,Angular应用程序的所有可视化元素也是由模块构建的。基于模块的架构的一个重大好处在于,与
JavaScript函数非常相像,如果一块代码变得过于复杂,或者承担了过多责任,你就可以把它打散,让每一段代码都只做一件
事。
也就是说,当我们把模块拆散成更小的模块时,我们就要确保它们可以把数据传来传去。到那时候,恰当地模块间通信机制就
成了我们应用程序的基础,可以让所有的数据都保持同步状态。幸运的是,Angular给我们提供了这样的工具来完成这件事。
如上图所示,我们可以在AppComponent之下构建整个应用程序,但这样做会让那个模块承担过多的责任。在基于模块的架构
里,大家公认比较好的实践是把模块拆散,好让它们都只承担单一的责任。
将数据传给模块
在Angular中,当一个父模块要把数据传入子模块中时,我们可以使用@Input。假设我们现在要构建一个程序,在页面上显示
评论。AppComment将负责加载所有的评论内容,我们会把每条评论数据都发送给评论模块。
我们将调用:
@Input() comment
把一个comment参数传入子模块。下面就是整块模块代码的样子:
@Component({
selector: 'comment',
templateUrl: './comment.component.html',
styleUrls: ['./comment.component.css']
})
export class CommentComponent {
@Input() comment;
现在我们可以从我们代码其它部分调用这个模块,并把它需要的数据传入这个模块了。这块代码看起来会像这样:
<comment [comment]="comment"></comment>
理解语法
首先,我们有一个模块选择器:
<comment></comment>
如果你以前用过Angular,这个语法看起来应该是很熟悉的。
其次是属性绑定:[comment]。这把我们元素的属性括起来的中括号第一眼看上去似乎有些令人费解。事实上,并不需要它们
来帮着把数据传到各个模块中,但没有它们,我们就只能把一个普通的文本字符串传入模块的@Input()。中括号可以告诉
Angular,这是一个属性绑定以及传给这个变量的值,所以这样就可以把动态数据值插入,传给各模块,而不只是传过去一个
字符串了。
最后,我们在“comment”的属性绑定之后有了属性的值。这一块就是告诉Angular要注意这个“comment”属性,并且把它传给我