Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 3b7b0d6

Browse files
committed
feat(directive-injector): introduce getFromParent[byKey] methods on DirectiveInjector
First step towards deprecating injector.parent access. The reason for the deprecation is that performing injector.parent.get without keeping track of current injector.appInjector is usually wrong (since the fallback would be injector.parent.appInjector).
1 parent 2a11b3a commit 3b7b0d6

File tree

5 files changed

+34
-20
lines changed

5 files changed

+34
-20
lines changed

lib/core_dom/directive_injector.dart

+20-16
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class DirectiveInjector implements DirectiveBinder {
100100
, KEEP_ME_LAST
101101
];
102102

103-
final DirectiveInjector parent;
103+
final DirectiveInjector _parent;
104104
final Injector appInjector;
105105
final Node _node;
106106
final NodeAttrs _nodeAttrs;
@@ -122,6 +122,9 @@ class DirectiveInjector implements DirectiveBinder {
122122
Key _key8 = null; dynamic _obj8; List<Key> _pKeys8; Function _factory8;
123123
Key _key9 = null; dynamic _obj9; List<Key> _pKeys9; Function _factory9;
124124

125+
@Deprecated("Deprecated. Use getFromParent instead.")
126+
Object get parent => this._parent;
127+
125128
static _toVisId(Visibility v) => identical(v, Visibility.LOCAL)
126129
? VISIBILITY_LOCAL
127130
: (identical(v, Visibility.CHILDREN) ? VISIBILITY_CHILDREN : VISIBILITY_DIRECT_CHILD);
@@ -140,12 +143,12 @@ class DirectiveInjector implements DirectiveBinder {
140143

141144
static Binding _tempBinding = new Binding();
142145

143-
DirectiveInjector(parent, appInjector, this._node, this._nodeAttrs, this._eventHandler,
144-
this.scope, this._animate)
146+
DirectiveInjector(DirectiveInjector parent, Injector appInjector, this._node, this._nodeAttrs,
147+
this._eventHandler, this.scope, this._animate)
145148
: appInjector = appInjector,
146-
parent = parent == null ? new DefaultDirectiveInjector(appInjector) : parent;
149+
_parent = parent == null ? new DefaultDirectiveInjector(appInjector) : parent;
147150

148-
DirectiveInjector._default(this.parent, this.appInjector)
151+
DirectiveInjector._default(this._parent, this.appInjector)
149152
: _node = null,
150153
_nodeAttrs = null,
151154
_eventHandler = null,
@@ -193,6 +196,7 @@ class DirectiveInjector implements DirectiveBinder {
193196
}
194197

195198
Object get(Type type) => getByKey(new Key(type));
199+
Object getFromParent(Type type) => _parent.get(type);
196200

197201
Object getByKey(Key key) {
198202
var oldTag = _TAG_GET.makeCurrent();
@@ -205,6 +209,7 @@ class DirectiveInjector implements DirectiveBinder {
205209
oldTag.makeCurrent();
206210
}
207211
}
212+
Object getFromParentByKey(Key key) => _parent.getByKey(key);
208213

209214
Object _getByKey(Key key) {
210215
int uid = key.uid;
@@ -228,12 +233,12 @@ class DirectiveInjector implements DirectiveBinder {
228233
} while (false);
229234
switch (visType) {
230235
case VISIBILITY_LOCAL: return appInjector.getByKey(k);
231-
case VISIBILITY_DIRECT_CHILD: return parent._getDirectiveByKey(k, VISIBILITY_LOCAL, i);
232-
case VISIBILITY_CHILDREN: return parent._getDirectiveByKey(k, VISIBILITY_CHILDREN, i);
236+
case VISIBILITY_DIRECT_CHILD: return _parent._getDirectiveByKey(k, VISIBILITY_LOCAL, i);
237+
case VISIBILITY_CHILDREN: return _parent._getDirectiveByKey(k, VISIBILITY_CHILDREN, i);
233238
// SHADOW
234-
case VISIBILITY_COMPONENT_LOCAL: return parent._getDirectiveByKey(k, VISIBILITY_LOCAL, i);
235-
case VISIBILITY_COMPONENT_DIRECT_CHILD: return parent._getDirectiveByKey(k, VISIBILITY_DIRECT_CHILD, i);
236-
case VISIBILITY_COMPONENT_CHILDREN: return parent._getDirectiveByKey(k, VISIBILITY_CHILDREN, i);
239+
case VISIBILITY_COMPONENT_LOCAL: return _parent._getDirectiveByKey(k, VISIBILITY_LOCAL, i);
240+
case VISIBILITY_COMPONENT_DIRECT_CHILD: return _parent._getDirectiveByKey(k, VISIBILITY_DIRECT_CHILD, i);
241+
case VISIBILITY_COMPONENT_CHILDREN: return _parent._getDirectiveByKey(k, VISIBILITY_CHILDREN, i);
237242
default: throw null;
238243
}
239244
}
@@ -265,7 +270,7 @@ class DirectiveInjector implements DirectiveBinder {
265270
case ELEMENT_PROBE_KEY_ID: return elementProbe;
266271
case NG_ELEMENT_KEY_ID: return ngElement;
267272
case EVENT_HANDLER_KEY_ID: return _eventHandler;
268-
case CONTENT_PORT_KEY_ID: return parent._getById(keyId);
273+
case CONTENT_PORT_KEY_ID: return _parent._getById(keyId);
269274
default: new NoProviderError(_KEYS[keyId]);
270275
}
271276
}
@@ -324,7 +329,7 @@ class DirectiveInjector implements DirectiveBinder {
324329

325330
ElementProbe get elementProbe {
326331
if (_elementProbe == null) {
327-
ElementProbe parentProbe = parent is DirectiveInjector ? parent.elementProbe : null;
332+
ElementProbe parentProbe = _parent == null ? null : _parent.elementProbe;
328333
_elementProbe = new ElementProbe(parentProbe, _node, this, scope);
329334
}
330335
return _elementProbe;
@@ -355,7 +360,7 @@ class TemplateDirectiveInjector extends DirectiveInjector {
355360
case VIEW_PORT_KEY_ID: return ((_viewPort) == null) ?
356361
_viewPort = new ViewPort(this, scope, _node, _animate) : _viewPort;
357362
case BOUND_VIEW_FACTORY_KEY_ID: return (_boundViewFactory == null) ?
358-
_boundViewFactory = _viewFactory.bind(this.parent) : _boundViewFactory;
363+
_boundViewFactory = _viewFactory.bind(_parent) : _boundViewFactory;
359364
default: return super._getById(keyId);
360365
}
361366
}
@@ -411,8 +416,7 @@ class ShadowDomComponentDirectiveInjector extends ComponentDirectiveInjector {
411416

412417
ElementProbe get elementProbe {
413418
if (_elementProbe == null) {
414-
ElementProbe parentProbe =
415-
parent is DirectiveInjector ? parent.elementProbe : parent.getByKey(ELEMENT_PROBE_KEY);
419+
ElementProbe parentProbe = _parent == null ? null : _parent.elementProbe;
416420
_elementProbe = new ElementProbe(parentProbe, _shadowRoot, this, scope);
417421
}
418422
return _elementProbe;
@@ -427,7 +431,7 @@ class DefaultDirectiveInjector extends DirectiveInjector {
427431

428432
Object getByKey(Key key) => appInjector.getByKey(key);
429433
_getDirectiveByKey(Key key, int visType, Injector i) =>
430-
parent == null ? i.getByKey(key) : parent._getDirectiveByKey(key, visType, i);
434+
_parent == null ? i.getByKey(key) : _parent._getDirectiveByKey(key, visType, i);
431435
_getById(int keyId) {
432436
switch (keyId) {
433437
case CONTENT_PORT_KEY_ID: return null;

lib/directive/ng_control.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ abstract class NgControl implements AttachAware, DetachAware {
4141

4242
NgControl(NgElement this._element, DirectiveInjector injector,
4343
Animate this._animate)
44-
: _parentControl = injector.parent.getByKey(NG_CONTROL_KEY);
44+
: _parentControl = injector.getFromParentByKey(NG_CONTROL_KEY);
4545

4646
@override
4747
void attach() {

lib/routing/ng_bind_route.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class NgBindRoute implements RouteProvider {
3838
NgBindRoute(this._router, this._injector, NgRoutingHelper _);
3939

4040
/// Returns the parent [RouteProvider].
41-
RouteProvider get _parent => _injector.parent.getByKey(ROUTE_PROVIDER_KEY);
41+
RouteProvider get _parent => _injector.getFromParentByKey(ROUTE_PROVIDER_KEY);
4242

4343
Route get route => routeName.startsWith('.') ?
4444
_parent.route.getRoute(routeName.substring(1)) :

lib/routing/ng_view.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class NgView implements DetachAware, RouteProvider {
7676
: _dirInjector = dirInjector,
7777
_locationService = dirInjector.getByKey(NG_ROUTING_HELPER_KEY)
7878
{
79-
RouteProvider routeProvider = dirInjector.parent.getByKey(NG_VIEW_KEY);
79+
RouteProvider routeProvider = dirInjector.getFromParentByKey(NG_VIEW_KEY);
8080
_route = routeProvider != null ?
8181
routeProvider.route.newHandle() :
8282
router.root.newHandle();

test/core_dom/directive_injector_spec.dart

+11-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ library directive_injector_spec;
22

33
import '../_specs.dart';
44
import 'package:angular/core_dom/directive_injector.dart';
5+
import 'package:angular/core_dom/static_keys.dart';
56

67
void main() {
78
describe('DirectiveInjector', () {
@@ -33,7 +34,6 @@ void main() {
3334
});
3435

3536
it('should return basic types', () {
36-
expect(injector.parent is DefaultDirectiveInjector).toBe(true);
3737
expect(injector.appInjector).toBe(appInjector);
3838
expect(injector.scope).toBe(scope);
3939
expect(injector.get(Injector)).toBe(appInjector);
@@ -47,6 +47,16 @@ void main() {
4747
expect((injector.get(ElementProbe) as ElementProbe).element).toBe(div);
4848
});
4949

50+
it('should support get from parent methods', () {
51+
var newDiv = new DivElement();
52+
var childInjector = new DirectiveInjector(
53+
injector, appInjector, newDiv, new NodeAttrs(newDiv), eventHandler, scope, animate);
54+
55+
expect(childInjector.get(Node)).toBe(newDiv);
56+
expect(childInjector.getFromParent(Node)).toBe(div);
57+
expect(childInjector.getFromParentByKey(NODE_KEY)).toBe(div);
58+
});
59+
5060
it('should instantiate types', () {
5161
addDirective(_Type9);
5262
addDirective(_Type8);

0 commit comments

Comments
 (0)