先来看基本用法
The result of an expression evaluation is interpreted differently depending on type of the expression evaluation result:
- string - all the CSS classes listed in a string (space delimited) are added
- Array - all the CSS classes (Array elements) are added
- Object - each key corresponds to a CSS class name while values are interpreted as expressions evaluating to Boolean. If a given expression evaluates to true a corresponding CSS class is added - otherwise it is removed.
再源码
没想到这么长。。。
@Directive({selector: '[ngClass]', inputs: ['rawClass: ngClass', 'initialClasses: class']}) |
- inputs - ng-class bound to NgClass.rawClass / class bound to NgClass.initialClasses考虑到ng给的还有原来html上的
set initialClasses(v) { |
this._applyInitialClasses(true);
对于原html上class处理:
调用_toggleClass(className: string, false)
可能遇到 class=”xx yy zz” class=”ii oo pp”在同一个元素的情况,这里处理
先把classNamesplite成 数组 classes
然后把所有的class 都从element上去掉了- 因为第一步给了false
this._initialClasses = isPresent(v) && isString(v) ? v.split(‘ ‘) : [];
this._applyInitialClasses(false);
这里都是为了处理同一个元素出现多个 class属性的问题
this._applyClasses(this._rawClass, false);
如果有ngclass 就渲染上,没有就算了
set rawClass(v) { |
_cleanupClasses 就是不管哪里进来的class 都从DOM干掉了
判断类型 如果是string 就赋值数组
如果是迭代或者obj 就 也返回一套数组但类型是 IterableDifferFactory[]并且设置mode.
string和obj mode是 keyValue, 数组就是iterable
ngDoCheck(): void { |
每次检查是否有区别,有的话就多的加上,少的干掉
ngOnDestroy(): void { this._cleanupClasses(this._rawClass); } |
就是全都干掉
总的来说,从ngclass 和 class 来的数据
先要把元素清理干净,那些特殊情况
然后都分成数组缓存变量中
differ检查重新渲染的节奏,这里没有关inline的style