Class和Style绑定、计算属性、过滤器
Class
<!-- standard class attribute setting --> <div class="bad curly special">Bad curly special</div> <!-- reset/override all class names with a binding --> <div class="bad curly special" [class]="badCurly">Bad curly</div> <!-- toggle the "special" class on/off with a property --> <div [class.special]="isSpecial">The class binding is special</div> <!-- binding to `class.special` trumps the class attribute --> <div class="special" [class.special]="!isSpecial">This one is not so special</div>
NgClass 指令
NgClass
指令接收一个对象,对象的 key
指定 css 类名,value 给定一个布尔值,当布尔值为真则作用该类名,当布尔值为假则移除给类名。
语法规则:
<div [ngClass]="{ css类名: 布尔值, css类名: 布尔值 }">测试文本</div>
基本示例:
.saveable{ font-size: 18px; } .modified { font-weight: bold; } .special{ background-color: #ff3300; }
currentClasses: {}; setCurrentClasses() { // CSS classes: added/removed per current state of component properties this.currentClasses = { 'saveable': this.canSave, 'modified': !this.isUnchanged, 'special': this.isSpecial }; }
<div [ngClass]="currentClasses">This div is initially saveable, unchanged, and special</div>
Style
通过样式绑定,可以设置内联样式。
样式绑定的语法与属性绑定类似。 但方括号中的部分不是元素的属性名,而由style前缀,一个点 (.
)和 CSS 样式的属性名组成。 形如:[style.style-property]
。
<button [style.color]="isSpecial ? 'red': 'green'">Red</button> <!-- 也可以 backgroundColor --> <button [style.background-color]="canSave ? 'cyan': 'grey'" >Save</button>
有些样式绑定中的样式带有单位。在这里,以根据条件用 “em” 和 “%” 来设置字体大小的单位。
<button [style.font-size.em]="isSpecial ? 3 : 1" >Big</button> <button [style.font-size.%]="!isSpecial ? 150 : 50" >Small</button>
提示:样式属性命名方法可以用中线命名法,像上面的一样 也可以用驼峰式命名法,如fontSize
NgStyle 指令
虽然这是设置单一样式的好办法,但我们通常更喜欢使用 NgStyle指令 来同时设置多个内联样式。
currentStyles: {}; setCurrentStyles() { // CSS styles: set per current state of component properties this.currentStyles = { 'font-style': this.canSave ? 'italic' : 'normal', 'font-weight': !this.isUnchanged ? 'bold' : 'normal', 'font-size': this.isSpecial ? '24px' : '12px' }; }
<div [ngStyle]="currentStyles"> This div is initially italic, normal weight, and extra large (24px). </div>
ngStyle 这种方式相当于在代码里面写 CSS 样式,比较丑陋,违反了注意点分离的原则,而且将来不太好修改,非常不建议这样写(足够简单的情况除外)。
模板引用变量
模板引用变量通常用来引用模板中的某个DOM元素,它还可以引用Angular组件或指令或Web Component。
使用井号 (#) 来声明引用变量。 #phone
的意思就是声明一个名叫phone
的变量来引用<input>
<input #phone placeholder="phone number">
<input #phone placeholder="phone number"> <!-- lots of other elements --> <!-- phone refers to the input element; pass its `value` to an event handler --> <button (click)="callPhone(phone.value)">Call</button>
大多数情况下,Angular会把模板引用变量的值设置为声明它的那个元素。在上面例子中,
phone
引用的是表示电话号码的<input>
框。 "拨号"按钮的点击事件处理器把这个input值传给了组件的callPhone
方法。 不过,指令也可以修改这种行为,让这个值引用到别处,比如它自身。NgForm
指令就是这么做的。
模板引用变量使用注意:
-
模板引用变量的作用范围是整个模板。 不要在同一个模板中多次定义同一个变量名,否则它在运行期间的值是无法确定的。
-
如果我在模板里面定义的局部变量和组件内部的属性重名会怎么样呢
-
如果真的出现了重名,Angular 会按照以下优先级来进行处理
-
模板局部变量 > 指令中的同名变量 > 组件中的同名属性
-
-
我们也可以用
ref-
前缀代替#
。 下面的例子中就用把fax
变量声明成了ref-fax
而不是#fax
。
<input ref-fax placeholder="fax number"> <button (click)="callFax(fax.value)">Fax</button>
过滤器
在 Angular 中,过滤器也叫管道。它最重要的作用就是用来格式化数据的输出。
举个简单例子:
public currentTime: Date = new Date(); ------------------------------------------------------ <h1>{{currentTime | date:'yyyy-MM-dd HH:mm:ss'}}</h1>
Angular 一共内置了16个过滤器:https://angular.io/api?type=pipe。
在复杂业务场景中,内置的过滤器肯定是不够用的,所有 Angular 也支持自定义过滤器。
管道还有另外一个重要的作用就是做国际化。