Skip to content

Commit 08f21db

Browse files
committed
feat(change_detection): implemented change detection that can be configured with pregenerated change detectors
1 parent d8c7c27 commit 08f21db

File tree

3 files changed

+54
-19
lines changed

3 files changed

+54
-19
lines changed

modules/angular2/change_detection.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ export {
5353
defaultPipes,
5454
DynamicChangeDetection,
5555
JitChangeDetection,
56+
PreGeneratedChangeDetection,
57+
preGeneratedProtoDetectors,
5658
defaultPipeRegistry
5759
} from './src/change_detection/change_detection';
5860

modules/angular2/src/change_detection/change_detection.ts

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ import {KeyValueChangesFactory} from './pipes/keyvalue_changes';
66
import {ObservablePipeFactory} from './pipes/observable_pipe';
77
import {PromisePipeFactory} from './pipes/promise_pipe';
88
import {NullPipeFactory} from './pipes/null_pipe';
9-
import {BindingRecord} from './binding_record';
10-
import {DirectiveRecord} from './directive_record';
11-
import {DEFAULT} from './constants';
129
import {ChangeDetection, ProtoChangeDetector, ChangeDetectorDefinition} from './interfaces';
1310
import {Injectable} from 'angular2/src/di/decorators';
14-
import {List} from 'angular2/src/facade/collection';
11+
import {List, StringMapWrapper} from 'angular2/src/facade/collection';
12+
import {isPresent, BaseException} from 'angular2/src/facade/lang';
1513

1614
// HACK: workaround for Traceur behavior.
1715
// It expects all transpiled modules to contain this marker.
@@ -47,6 +45,34 @@ export var defaultPipes = {
4745
"async": async
4846
};
4947

48+
export var preGeneratedProtoDetectors = {};
49+
50+
51+
/**
52+
* Implements change detection using a map of pregenerated proto detectors.
53+
*
54+
* @exportedAs angular2/change_detection
55+
*/
56+
export class PreGeneratedChangeDetection extends ChangeDetection {
57+
_dynamicChangeDetection: ChangeDetection;
58+
_protoChangeDetectors: any;
59+
60+
constructor(private registry: PipeRegistry, protoChangeDetectors?) {
61+
super();
62+
this._dynamicChangeDetection = new DynamicChangeDetection(registry);
63+
this._protoChangeDetectors =
64+
isPresent(protoChangeDetectors) ? protoChangeDetectors : preGeneratedProtoDetectors;
65+
}
66+
67+
createProtoChangeDetector(definition: ChangeDetectorDefinition): ProtoChangeDetector {
68+
var id = definition.id;
69+
if (StringMapWrapper.contains(this._protoChangeDetectors, id)) {
70+
return StringMapWrapper.get(this._protoChangeDetectors, id)(this.registry);
71+
}
72+
return this._dynamicChangeDetection.createProtoChangeDetector(definition);
73+
}
74+
}
75+
5076

5177
/**
5278
* Implements change detection that does not require `eval()`.
@@ -57,9 +83,9 @@ export var defaultPipes = {
5783
*/
5884
@Injectable()
5985
export class DynamicChangeDetection extends ChangeDetection {
60-
constructor(public registry: PipeRegistry) { super(); }
86+
constructor(private registry: PipeRegistry) { super(); }
6187

62-
createProtoChangeDetector(definition:ChangeDetectorDefinition): ProtoChangeDetector {
88+
createProtoChangeDetector(definition: ChangeDetectorDefinition): ProtoChangeDetector {
6389
return new DynamicProtoChangeDetector(this.registry, definition);
6490
}
6591
}
@@ -76,7 +102,7 @@ export class DynamicChangeDetection extends ChangeDetection {
76102
export class JitChangeDetection extends ChangeDetection {
77103
constructor(public registry: PipeRegistry) { super(); }
78104

79-
createProtoChangeDetector(definition:ChangeDetectorDefinition): ProtoChangeDetector {
105+
createProtoChangeDetector(definition: ChangeDetectorDefinition): ProtoChangeDetector {
80106
return new JitProtoChangeDetector(this.registry, definition);
81107
}
82108
}
Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import {ddescribe, describe, it, iit, xit, expect, beforeEach, afterEach} from 'angular2/test_lib';
22

3-
import {PreGeneratedChangeDetection} from 'angular2/change_detection';
3+
import {PreGeneratedChangeDetection, ChangeDetectorDefinition, ProtoChangeDetector, DynamicProtoChangeDetector} from 'angular2/change_detection';
4+
5+
class DummyChangeDetector extends ProtoChangeDetector {}
46

57
export function main() {
68
describe("PreGeneratedChangeDetection", () => {
7-
it("sfs", () => {
9+
var proto;
10+
var def;
11+
12+
beforeEach(() => {
13+
proto = new DummyChangeDetector();
14+
def = new ChangeDetectorDefinition('id', null, [], [], []);
15+
});
816

9-
var rs = coalesce([
10-
r("user", [], 0, 1, true),
11-
r("user", [], 0, 2, true)
12-
]);
17+
it("should return a proto change detector when one is available", () => {
18+
var map = {'id' : (registry) => proto};
19+
var cd = new PreGeneratedChangeDetection(null, map);
20+
21+
expect(cd.createProtoChangeDetector(def)).toBe(proto)
22+
});
1323

14-
expect(rs[1]).toEqual(new ProtoRecord(
15-
RECORD_TYPE_SELF, "self", null,
16-
[], null, 1, null, 2,
17-
null, null,
18-
true, false)
19-
);
24+
it("should delegate to dynamic change detection otherwise", () => {
25+
var cd = new PreGeneratedChangeDetection(null, {});
26+
expect(cd.createProtoChangeDetector(def)).toBeAnInstanceOf(DynamicProtoChangeDetector);
2027
});
2128
});
2229
}

0 commit comments

Comments
 (0)