refactor(compiler): generate less code for bindings to DOM elements
Detailed changes:
- remove `UNINITIALIZED`, initialize change detection fields with `undefined`.
* we use `view.numberOfChecks === 0` now everywhere
as indicator whether we are in the first change detection cycle
(previously we used this only in a couple of places).
* we keep the initialization itself as change detection get slower without it.
- remove passing around `throwOnChange` in various generated calls,
and store it on the view as property instead.
- change generated code for bindings to DOM elements as follows:
Before:
```
var currVal_10 = self.context.bgColor;
if (jit_checkBinding15(self.throwOnChange,self._expr_10,currVal_10)) {
self.renderer.setElementStyle(self._el_0,'backgroundColor',((self.viewUtils.sanitizer.sanitize(jit_21,currVal_10) == null)? null: self.viewUtils.sanitizer.sanitize(jit_21,currVal_10).toString()));
self._expr_10 = currVal_10;
}
var currVal_11 = jit_inlineInterpolate16(1,' ',self.context.data.value,' ');
if (jit_checkBinding15(self.throwOnChange,self._expr_11,currVal_11)) {
self.renderer.setText(self._text_1,currVal_11);
self._expr_11 = currVal_11;
}
```,
After:
```
var currVal_10 = self.context.bgColor;
jit_checkRenderStyle14(self,self._el_0,'backgroundColor',null,self._expr_10,self._expr_10=currVal_10,false,jit_21);
var currVal_11 = jit_inlineInterpolate15(1,' ',self.context.data.value,' ');
jit_checkRenderText16(self,self._text_1,self._expr_11,self._expr_11=currVal_11,false);
```
Performance impact:
- None seen (checked against internal latency lab)
Part of #13651
This commit is contained in:
@@ -286,7 +286,7 @@ export function main() {
|
||||
const formValidator = (c: any /** TODO #9100 */) => ({'custom': true});
|
||||
const f = new FormGroupDirective([formValidator], []);
|
||||
f.form = formModel;
|
||||
f.ngOnChanges({'form': new SimpleChange(null, null)});
|
||||
f.ngOnChanges({'form': new SimpleChange(null, null, false)});
|
||||
|
||||
expect(formModel.errors).toEqual({'custom': true});
|
||||
});
|
||||
@@ -294,7 +294,7 @@ export function main() {
|
||||
it('should set up an async validator', fakeAsync(() => {
|
||||
const f = new FormGroupDirective([], [asyncValidator('expected')]);
|
||||
f.form = formModel;
|
||||
f.ngOnChanges({'form': new SimpleChange(null, null)});
|
||||
f.ngOnChanges({'form': new SimpleChange(null, null, false)});
|
||||
|
||||
tick();
|
||||
|
||||
@@ -514,7 +514,7 @@ export function main() {
|
||||
it('should reexport new control properties', () => {
|
||||
const newControl = new FormControl(null);
|
||||
controlDir.form = newControl;
|
||||
controlDir.ngOnChanges({'form': new SimpleChange(control, newControl)});
|
||||
controlDir.ngOnChanges({'form': new SimpleChange(control, newControl, false)});
|
||||
|
||||
checkProperties(newControl);
|
||||
});
|
||||
@@ -523,7 +523,7 @@ export function main() {
|
||||
expect(control.valid).toBe(true);
|
||||
|
||||
// this will add the required validator and recalculate the validity
|
||||
controlDir.ngOnChanges({'form': new SimpleChange(null, control)});
|
||||
controlDir.ngOnChanges({'form': new SimpleChange(null, control, false)});
|
||||
|
||||
expect(control.valid).toBe(false);
|
||||
});
|
||||
@@ -596,39 +596,39 @@ export function main() {
|
||||
}));
|
||||
|
||||
it('should mark as disabled properly', fakeAsync(() => {
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', undefined)});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', undefined, false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(false);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', null)});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', null, false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(false);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', false)});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', false, false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(false);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', 'false')});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', 'false', false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(false);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', 0)});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange('', 0, false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(false);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, '')});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, '', false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(true);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, 'true')});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, 'true', false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(true);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, true)});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, true, false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(true);
|
||||
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, 'anything else')});
|
||||
ngModel.ngOnChanges({isDisabled: new SimpleChange(null, 'anything else', false)});
|
||||
tick();
|
||||
expect(ngModel.control.disabled).toEqual(true);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user