refactor(change_detection): renamed BindingPropagationConfig to ChangeDetectorRef

This commit is contained in:
vsavkin 2015-04-14 07:47:12 -07:00
parent 213dabdceb
commit 8c1adabe1c
17 changed files with 89 additions and 73 deletions

View File

@ -20,7 +20,7 @@ export {DynamicProtoChangeDetector, JitProtoChangeDetector} from './src/change_d
export {BindingRecord} from './src/change_detection/binding_record'; export {BindingRecord} from './src/change_detection/binding_record';
export {DirectiveRecord} from './src/change_detection/directive_record'; export {DirectiveRecord} from './src/change_detection/directive_record';
export {DynamicChangeDetector} from './src/change_detection/dynamic_change_detector'; export {DynamicChangeDetector} from './src/change_detection/dynamic_change_detector';
export {BindingPropagationConfig} from './src/change_detection/binding_propagation_config'; export {ChangeDetectorRef} from './src/change_detection/change_detector_ref';
export {PipeRegistry} from './src/change_detection/pipes/pipe_registry'; export {PipeRegistry} from './src/change_detection/pipes/pipe_registry';
export {uninitialized} from './src/change_detection/change_detection_util'; export {uninitialized} from './src/change_detection/change_detection_util';
export {NO_CHANGE, Pipe} from './src/change_detection/pipes/pipe'; export {NO_CHANGE, Pipe} from './src/change_detection/pipes/pipe';

View File

@ -1,6 +1,6 @@
import {isPresent} from 'angular2/src/facade/lang'; import {isPresent} from 'angular2/src/facade/lang';
import {List, ListWrapper} from 'angular2/src/facade/collection'; import {List, ListWrapper} from 'angular2/src/facade/collection';
import {BindingPropagationConfig} from './binding_propagation_config'; import {ChangeDetectorRef} from './change_detector_ref';
import {ChangeDetector} from './interfaces'; import {ChangeDetector} from './interfaces';
import {CHECK_ALWAYS, CHECK_ONCE, CHECKED, DETACHED, ON_PUSH} from './constants'; import {CHECK_ALWAYS, CHECK_ONCE, CHECKED, DETACHED, ON_PUSH} from './constants';
@ -9,13 +9,13 @@ export class AbstractChangeDetector extends ChangeDetector {
shadowDomChildren:List; shadowDomChildren:List;
parent:ChangeDetector; parent:ChangeDetector;
mode:string; mode:string;
bindingPropagationConfig:BindingPropagationConfig; changeDetectorRef:ChangeDetectorRef;
constructor() { constructor() {
super(); super();
this.lightDomChildren = []; this.lightDomChildren = [];
this.shadowDomChildren = []; this.shadowDomChildren = [];
this.bindingPropagationConfig = new BindingPropagationConfig(this); this.changeDetectorRef = new ChangeDetectorRef(this);
this.mode = null; this.mode = null;
} }

View File

@ -1,29 +0,0 @@
import {ChangeDetector} from './interfaces';
import {CHECK_ONCE, DETACHED, CHECK_ALWAYS} from './constants';
/**
* @exportedAs angular2/change_detection
*/
export class BindingPropagationConfig {
_cd:ChangeDetector;
constructor(cd:ChangeDetector) {
this._cd = cd;
}
shouldBePropagated() {
this._cd.mode = CHECK_ONCE;
}
shouldBePropagatedFromRoot() {
this._cd.markPathToRootAsCheckOnce();
}
shouldNotPropagate() {
this._cd.mode = DETACHED;
}
shouldAlwaysPropagate() {
this._cd.mode = CHECK_ALWAYS;
}
}

View File

@ -362,13 +362,13 @@ export class ChangeDetectorJITGenerator {
var change = this.changeNames[r.selfIndex]; var change = this.changeNames[r.selfIndex];
var pipe = this.pipeNames[r.selfIndex]; var pipe = this.pipeNames[r.selfIndex];
var bpc = r.mode === RECORD_TYPE_BINDING_PIPE ? "this.bindingPropagationConfig" : "null"; var cdRef = r.mode === RECORD_TYPE_BINDING_PIPE ? "this.changeDetectorRef" : "null";
var update = this.genUpdateDirectiveOrElement(r); var update = this.genUpdateDirectiveOrElement(r);
var addToChanges = this.genAddToChanges(r); var addToChanges = this.genAddToChanges(r);
var lastInDirective = this.genNotifyOnChanges(r); var lastInDirective = this.genNotifyOnChanges(r);
return pipeCheckTemplate(r.selfIndex - 1, context, bpc, pipe, r.name, oldValue, newValue, change, return pipeCheckTemplate(r.selfIndex - 1, context, cdRef, pipe, r.name, oldValue, newValue, change,
update, addToChanges, lastInDirective); update, addToChanges, lastInDirective);
} }

View File

@ -0,0 +1,45 @@
import {ChangeDetector} from './interfaces';
import {CHECK_ONCE, DETACHED, CHECK_ALWAYS} from './constants';
/**
* Controls change detection.
*
* [ChangeDetectorRef] allows requesting checks for detectors that rely on observables. It also allows detaching and
* attaching change detector subtrees.
*
* @exportedAs angular2/change_detection
*/
export class ChangeDetectorRef {
_cd:ChangeDetector;
constructor(cd:ChangeDetector) {
this._cd = cd;
}
/**
* Request to check all ON_PUSH ancestors.
*/
requestCheck() {
this._cd.markPathToRootAsCheckOnce();
}
/**
* Detaches the change detector from the change detector tree.
*
* The detached change detector will not be checked until it is reattached.
*/
detach() {
this._cd.mode = DETACHED;
}
/**
* Reattach the change detector to the change detector tree.
*
* This also requests a check of this change detector. This reattached change detector will be checked during the
* next change detection run.
*/
reattach() {
this._cd.mode = CHECK_ALWAYS;
this.requestCheck();
}
}

View File

@ -245,12 +245,12 @@ export class DynamicChangeDetector extends AbstractChangeDetector {
} }
// Currently, only pipes that used in bindings in the template get // Currently, only pipes that used in bindings in the template get
// the bindingPropagationConfig of the encompassing component. // the changeDetectorRef of the encompassing component.
// //
// In the future, pipes declared in the bind configuration should // In the future, pipes declared in the bind configuration should
// be able to access the bindingPropagationConfig of that component. // be able to access the changeDetectorRef of that component.
var bpc = proto.mode === RECORD_TYPE_BINDING_PIPE ? this.bindingPropagationConfig : null; var cdr = proto.mode === RECORD_TYPE_BINDING_PIPE ? this.changeDetectorRef : null;
var pipe = this.pipeRegistry.get(proto.name, context, bpc); var pipe = this.pipeRegistry.get(proto.name, context, cdr);
this._writePipe(proto, pipe); this._writePipe(proto, pipe);
return pipe; return pipe;
} }

View File

@ -21,7 +21,7 @@ export class IterableChangesFactory {
return IterableChanges.supportsObj(obj); return IterableChanges.supportsObj(obj);
} }
create(bpc):Pipe { create(cdRef):Pipe {
return new IterableChanges(); return new IterableChanges();
} }
} }

View File

@ -11,7 +11,7 @@ export class KeyValueChangesFactory {
return KeyValueChanges.supportsObj(obj); return KeyValueChanges.supportsObj(obj);
} }
create(bpc):Pipe { create(cdRef):Pipe {
return new KeyValueChanges(); return new KeyValueChanges();
} }
} }

View File

@ -9,7 +9,7 @@ export class NullPipeFactory {
return NullPipe.supportsObj(obj); return NullPipe.supportsObj(obj);
} }
create(bpc):Pipe { create(cdRef):Pipe {
return new NullPipe(); return new NullPipe();
} }
} }

View File

@ -1,7 +1,7 @@
import {List, ListWrapper} from 'angular2/src/facade/collection'; import {List, ListWrapper} from 'angular2/src/facade/collection';
import {isBlank, isPresent, BaseException, CONST} from 'angular2/src/facade/lang'; import {isBlank, isPresent, BaseException, CONST} from 'angular2/src/facade/lang';
import {Pipe} from './pipe'; import {Pipe} from './pipe';
import {BindingPropagationConfig} from '../binding_propagation_config'; import {ChangeDetectorRef} from '../change_detector_ref';
export class PipeRegistry { export class PipeRegistry {
config; config;
@ -10,7 +10,7 @@ export class PipeRegistry {
this.config = config; this.config = config;
} }
get(type:string, obj, bpc:BindingPropagationConfig):Pipe { get(type:string, obj, cdRef:ChangeDetectorRef):Pipe {
var listOfConfigs = this.config[type]; var listOfConfigs = this.config[type];
if (isBlank(listOfConfigs)) { if (isBlank(listOfConfigs)) {
throw new BaseException(`Cannot find a pipe for type '${type}' object '${obj}'`); throw new BaseException(`Cannot find a pipe for type '${type}' object '${obj}'`);
@ -23,6 +23,6 @@ export class PipeRegistry {
throw new BaseException(`Cannot find a pipe for type '${type}' object '${obj}'`); throw new BaseException(`Cannot find a pipe for type '${type}' object '${obj}'`);
} }
return matchingConfig.create(bpc); return matchingConfig.create(cdRef);
} }
} }

View File

@ -8,7 +8,7 @@ import * as viewModule from 'angular2/src/core/compiler/view';
import {ViewContainer} from 'angular2/src/core/compiler/view_container'; import {ViewContainer} from 'angular2/src/core/compiler/view_container';
import {NgElement} from 'angular2/src/core/compiler/ng_element'; import {NgElement} from 'angular2/src/core/compiler/ng_element';
import {Directive, Component, onChange, onDestroy, onAllChangesDone} from 'angular2/src/core/annotations/annotations'; import {Directive, Component, onChange, onDestroy, onAllChangesDone} from 'angular2/src/core/annotations/annotations';
import {BindingPropagationConfig} from 'angular2/change_detection'; import {ChangeDetectorRef} from 'angular2/change_detection';
import {QueryList} from './query_list'; import {QueryList} from './query_list';
var _MAX_DIRECTIVE_CONSTRUCTION_COUNTER = 10; var _MAX_DIRECTIVE_CONSTRUCTION_COUNTER = 10;
@ -46,7 +46,7 @@ class StaticKeys {
viewId:number; viewId:number;
ngElementId:number; ngElementId:number;
viewContainerId:number; viewContainerId:number;
bindingPropagationConfigId:number; changeDetectorRefId:number;
elementRefId:number; elementRefId:number;
constructor() { constructor() {
@ -54,7 +54,7 @@ class StaticKeys {
this.viewId = Key.get(viewModule.AppView).id; this.viewId = Key.get(viewModule.AppView).id;
this.ngElementId = Key.get(NgElement).id; this.ngElementId = Key.get(NgElement).id;
this.viewContainerId = Key.get(ViewContainer).id; this.viewContainerId = Key.get(ViewContainer).id;
this.bindingPropagationConfigId = Key.get(BindingPropagationConfig).id; this.changeDetectorRefId = Key.get(ChangeDetectorRef).id;
this.elementRefId = Key.get(ElementRef).id; this.elementRefId = Key.get(ElementRef).id;
} }
@ -298,13 +298,13 @@ export class PreBuiltObjects {
view:viewModule.AppView; view:viewModule.AppView;
element:NgElement; element:NgElement;
viewContainer:ViewContainer; viewContainer:ViewContainer;
bindingPropagationConfig:BindingPropagationConfig; changeDetectorRef:ChangeDetectorRef;
constructor(view, element:NgElement, viewContainer:ViewContainer, constructor(view, element:NgElement, viewContainer:ViewContainer,
bindingPropagationConfig:BindingPropagationConfig) { changeDetectorRef:ChangeDetectorRef) {
this.view = view; this.view = view;
this.element = element; this.element = element;
this.viewContainer = viewContainer; this.viewContainer = viewContainer;
this.bindingPropagationConfig = bindingPropagationConfig; this.changeDetectorRef = changeDetectorRef;
} }
} }
@ -885,7 +885,7 @@ export class ElementInjector extends TreeNode {
if (keyId === staticKeys.viewId) return this._preBuiltObjects.view; if (keyId === staticKeys.viewId) return this._preBuiltObjects.view;
if (keyId === staticKeys.ngElementId) return this._preBuiltObjects.element; if (keyId === staticKeys.ngElementId) return this._preBuiltObjects.element;
if (keyId === staticKeys.viewContainerId) return this._preBuiltObjects.viewContainer; if (keyId === staticKeys.viewContainerId) return this._preBuiltObjects.viewContainer;
if (keyId === staticKeys.bindingPropagationConfigId) return this._preBuiltObjects.bindingPropagationConfig; if (keyId === staticKeys.changeDetectorRefId) return this._preBuiltObjects.changeDetectorRef;
//TODO add other objects as needed //TODO add other objects as needed
return _undefined; return _undefined;

View File

@ -1,6 +1,6 @@
import {ListWrapper, MapWrapper, Map, StringMapWrapper, List} from 'angular2/src/facade/collection'; import {ListWrapper, MapWrapper, Map, StringMapWrapper, List} from 'angular2/src/facade/collection';
import {AST, Locals, ChangeDispatcher, ProtoChangeDetector, ChangeDetector, import {AST, Locals, ChangeDispatcher, ProtoChangeDetector, ChangeDetector,
ChangeRecord, BindingRecord, DirectiveRecord, BindingPropagationConfig} from 'angular2/change_detection'; ChangeRecord, BindingRecord, DirectiveRecord, ChangeDetectorRef} from 'angular2/change_detection';
import {ProtoElementInjector, ElementInjector, PreBuiltObjects, DirectiveBinding} from './element_injector'; import {ProtoElementInjector, ElementInjector, PreBuiltObjects, DirectiveBinding} from './element_injector';
import {ElementBinder} from './element_binder'; import {ElementBinder} from './element_binder';

View File

@ -5,7 +5,7 @@ import {isPresent, isBlank, BaseException} from 'angular2/src/facade/lang';
import {NgElement} from 'angular2/src/core/compiler/ng_element'; import {NgElement} from 'angular2/src/core/compiler/ng_element';
import * as vcModule from './view_container'; import * as vcModule from './view_container';
import * as viewModule from './view'; import * as viewModule from './view';
import {BindingPropagationConfig} from 'angular2/change_detection'; import {ChangeDetectorRef} from 'angular2/change_detection';
// TODO(tbosch): Make this an OpaqueToken as soon as our transpiler supports this! // TODO(tbosch): Make this an OpaqueToken as soon as our transpiler supports this!
export const VIEW_POOL_CAPACITY = 'ViewFactory.viewPoolCapacity'; export const VIEW_POOL_CAPACITY = 'ViewFactory.viewPoolCapacity';
@ -77,12 +77,12 @@ export class ViewFactory {
elementInjectors[binderIdx] = elementInjector; elementInjectors[binderIdx] = elementInjector;
// componentChildViews // componentChildViews
var bindingPropagationConfig = null; var changeDetectorRef = null;
if (binder.hasStaticComponent()) { if (binder.hasStaticComponent()) {
var childView = this._createView(binder.nestedProtoView); var childView = this._createView(binder.nestedProtoView);
changeDetector.addShadowDomChild(childView.changeDetector); changeDetector.addShadowDomChild(childView.changeDetector);
bindingPropagationConfig = new BindingPropagationConfig(childView.changeDetector); changeDetectorRef = new ChangeDetectorRef(childView.changeDetector);
componentChildViews[binderIdx] = childView; componentChildViews[binderIdx] = childView;
} }
@ -97,7 +97,7 @@ export class ViewFactory {
// preBuiltObjects // preBuiltObjects
if (isPresent(elementInjector)) { if (isPresent(elementInjector)) {
preBuiltObjects[binderIdx] = new eli.PreBuiltObjects(view, new NgElement(view, binderIdx), viewContainer, preBuiltObjects[binderIdx] = new eli.PreBuiltObjects(view, new NgElement(view, binderIdx), viewContainer,
bindingPropagationConfig); changeDetectorRef);
} }
} }

View File

@ -673,7 +673,7 @@ export function main() {
cd.detectChanges(); cd.detectChanges();
expect(registry.bpc).toBe(cd.bindingPropagationConfig); expect(registry.cdRef).toBe(cd.changeDetectorRef);
}); });
}); });
@ -762,7 +762,7 @@ class FakePipeRegistry extends PipeRegistry {
numberOfLookups:number; numberOfLookups:number;
pipeType:string; pipeType:string;
factory:Function; factory:Function;
bpc:any; cdRef:any;
constructor(pipeType, factory) { constructor(pipeType, factory) {
super({}); super({});
@ -771,10 +771,10 @@ class FakePipeRegistry extends PipeRegistry {
this.numberOfLookups = 0; this.numberOfLookups = 0;
} }
get(type:string, obj, bpc) { get(type:string, obj, cdRef) {
if (type != this.pipeType) return null; if (type != this.pipeType) return null;
this.numberOfLookups ++; this.numberOfLookups ++;
this.bpc = bpc; this.cdRef = cdRef;
return this.factory(); return this.factory();
} }
} }

View File

@ -51,7 +51,7 @@ class PipeFactory {
return this.shouldSupport; return this.shouldSupport;
} }
create(bpc):Pipe { create(cdRef):Pipe {
return this.pipe; return this.pipe;
} }
} }

View File

@ -11,7 +11,7 @@ import {AppProtoView, AppView} from 'angular2/src/core/compiler/view';
import {ViewContainer} from 'angular2/src/core/compiler/view_container'; import {ViewContainer} from 'angular2/src/core/compiler/view_container';
import {NgElement} from 'angular2/src/core/compiler/ng_element'; import {NgElement} from 'angular2/src/core/compiler/ng_element';
import {Directive} from 'angular2/src/core/annotations/annotations'; import {Directive} from 'angular2/src/core/annotations/annotations';
import {BindingPropagationConfig, Parser, Lexer} from 'angular2/change_detection'; import {ChangeDetectorRef, Parser, Lexer} from 'angular2/change_detection';
import {ViewRef, Renderer, EventBinding} from 'angular2/src/render/api'; import {ViewRef, Renderer, EventBinding} from 'angular2/src/render/api';
import {QueryList} from 'angular2/src/core/compiler/query_list'; import {QueryList} from 'angular2/src/core/compiler/query_list';
@ -620,11 +620,11 @@ export function main() {
expect(inj.get(ViewContainer)).toEqual(viewContainer); expect(inj.get(ViewContainer)).toEqual(viewContainer);
}); });
it('should return bindingPropagationConfig', function () { it('should return changeDetectorRef', function () {
var config = new BindingPropagationConfig(null); var config = new ChangeDetectorRef(null);
var inj = injector([], null, null, new PreBuiltObjects(null, null, null, config)); var inj = injector([], null, null, new PreBuiltObjects(null, null, null, config));
expect(inj.get(BindingPropagationConfig)).toEqual(config); expect(inj.get(ChangeDetectorRef)).toEqual(config);
}); });
}); });

View File

@ -22,7 +22,7 @@ import {PromiseWrapper} from 'angular2/src/facade/async';
import {Injector, bind} from 'angular2/di'; import {Injector, bind} from 'angular2/di';
import {dynamicChangeDetection, import {dynamicChangeDetection,
ChangeDetection, DynamicChangeDetection, Pipe, PipeRegistry, BindingPropagationConfig, ON_PUSH} from 'angular2/change_detection'; ChangeDetection, DynamicChangeDetection, Pipe, PipeRegistry, ChangeDetectorRef, ON_PUSH} from 'angular2/change_detection';
import {Decorator, Component, Viewport, DynamicComponent} from 'angular2/src/core/annotations/annotations'; import {Decorator, Component, Viewport, DynamicComponent} from 'angular2/src/core/annotations/annotations';
import {View} from 'angular2/src/core/annotations/view'; import {View} from 'angular2/src/core/annotations/view';
@ -390,7 +390,7 @@ export function main() {
}) })
})); }));
describe("BindingPropagationConfig", () => { describe("ChangeDetectorRef", () => {
it("can be used to disable the change detection of the component's template", it("can be used to disable the change detection of the component's template",
inject([TestBed, AsyncTestCompleter], (tb, async) => { inject([TestBed, AsyncTestCompleter], (tb, async) => {
@ -802,12 +802,12 @@ class MyDir {
@View({template: '{{field}}'}) @View({template: '{{field}}'})
class PushBasedComp { class PushBasedComp {
numberOfChecks:number; numberOfChecks:number;
bpc:BindingPropagationConfig; ref:ChangeDetectorRef;
prop; prop;
constructor(bpc:BindingPropagationConfig) { constructor(ref:ChangeDetectorRef) {
this.numberOfChecks = 0; this.numberOfChecks = 0;
this.bpc = bpc; this.ref = ref;
} }
get field(){ get field(){
@ -816,7 +816,7 @@ class PushBasedComp {
} }
propagate() { propagate() {
this.bpc.shouldBePropagatedFromRoot(); this.ref.requestCheck();
} }
} }
@ -943,7 +943,7 @@ class DoublePipeFactory {
return true; return true;
} }
create(bpc) { create(cdRef) {
return new DoublePipe(); return new DoublePipe();
} }
} }