本节书摘来自华章出版社《AngularJS深度剖析与最佳实践》一书中的第2章,第2.5节,作者 雪狼 破狼 彭洪伟,更多章节内容可以访问云栖社区“华章计算机”公众号查看
2.5 视图
我们有了模块和控制器之后,内容和交互逻辑就已经基本确定了,接下来我们就得把它们展示给用户了,这时就用到“视图”(view)。
CSS并不在Angular的范围内,在实践中,常常结合一套成熟的CSS架构来做,比如Bootstrap就可以和Angular结合得非常好。
Angular中实现视图的主体是模板。最常见的模板形式当然是HTML,也有通过Jade等中间语言编译为HTML的。模板中包括静态信息和动态信息,静态信息是指直接写死(hard code)在模板中的,而动态信息则是对scope中内容的展示。
展示动态信息的方式有两种:
绑定表达式:形式如{{username}},绑定表达式可以出现在HTML中的文本部分或节点的属性部分。
指令:形式如,事实上任何指令都可以用来展示动态信息,展示的方式取决于指令的内在实现逻辑。
视图中的绑定表达式或指令中用到的变量或函数都是$scope中的一个属性或方法,上面两个表达式绑定的都是$scope.username,但是也可以绑定到方法,如$scope.getFirstName()。绑定到方法是一种很常用的方式,但是如果使用不当,也可能导致一些很难追查的Bug。特别要注意不要在方法中返回一个新对象或新数组,否则会出现“10 $digest iterations reached.”错误。
另一个要点是,在表达式中无法直接使用window对象下的全局属性或方法。Angular这样的设计可以确保视图的局部性,以免受到意料之外的干扰而出现Bug。如果确实需要调用,请在Controller中简单包装一层。
除了展示信息之外,常常还需要对信息进行格式化,比如把一个Date对象格式化为“年-月-日”格式或“年-月-日 时:分:秒”格式。一个分层清晰的系统,在scope中通常是没有格式的概念的,想要显示成什么格式是视图层的事情。这样的设计可以提高Model层的内聚性(只做一件事),把与此相关的需求变更在视图层处理,可以提高Model层的稳定性。
Angular中对信息进行格式化的机制是过滤器(Filter),如:{{birthday|date}}。对过滤器的更深入讲解,请参见稍后的2.7节“过滤器”。