fix(di): allow injecting event emitter fns without specifying type annotation
Fixes #965 Closes #1155
This commit is contained in:
parent
9adf41ca2d
commit
ae30d7ba40
|
@ -12,6 +12,10 @@ export class EventEmitter extends DependencyAnnotation {
|
||||||
super();
|
super();
|
||||||
this.eventName = eventName;
|
this.eventName = eventName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get token() {
|
||||||
|
return Function;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,6 +29,10 @@ export class PropertySetter extends DependencyAnnotation {
|
||||||
super();
|
super();
|
||||||
this.propName = propName;
|
this.propName = propName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get token() {
|
||||||
|
return Function;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -107,6 +107,10 @@ export class DependencyAnnotation {
|
||||||
@CONST()
|
@CONST()
|
||||||
constructor() {
|
constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get token() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -135,7 +135,11 @@ function _extractToken(typeOrFunc, annotations) {
|
||||||
optional = true;
|
optional = true;
|
||||||
|
|
||||||
} else if (paramAnnotation instanceof DependencyAnnotation) {
|
} else if (paramAnnotation instanceof DependencyAnnotation) {
|
||||||
|
if (isPresent(paramAnnotation.token)) {
|
||||||
|
token = paramAnnotation.token;
|
||||||
|
}
|
||||||
ListWrapper.push(depProps, paramAnnotation);
|
ListWrapper.push(depProps, paramAnnotation);
|
||||||
|
|
||||||
} else if (paramAnnotation.name === "string") {
|
} else if (paramAnnotation.name === "string") {
|
||||||
token = paramAnnotation;
|
token = paramAnnotation;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,16 @@ class NeedsEventEmitter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NeedsEventEmitterNoType {
|
||||||
|
clickEmitter;
|
||||||
|
constructor(@EventEmitter('click') clickEmitter) {
|
||||||
|
this.clickEmitter = clickEmitter;
|
||||||
|
}
|
||||||
|
click() {
|
||||||
|
this.clickEmitter(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class NeedsPropertySetter {
|
class NeedsPropertySetter {
|
||||||
propSetter;
|
propSetter;
|
||||||
roleSetter;
|
roleSetter;
|
||||||
|
@ -113,6 +123,17 @@ class NeedsPropertySetter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NeedsPropertySetterNoType {
|
||||||
|
propSetter;
|
||||||
|
constructor(@PropertySetter('title') propSetter) {
|
||||||
|
this.propSetter = propSetter;
|
||||||
|
}
|
||||||
|
|
||||||
|
setProp(value) {
|
||||||
|
this.propSetter(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class NeedsAttribute {
|
class NeedsAttribute {
|
||||||
typeAttribute;
|
typeAttribute;
|
||||||
titleAttribute;
|
titleAttribute;
|
||||||
|
@ -545,24 +566,43 @@ export function main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('event emitters', () => {
|
describe('event emitters', () => {
|
||||||
it('should be injectable and callable', () => {
|
|
||||||
var called = false;
|
function createpreBuildObject(eventName, eventHandler) {
|
||||||
var handlers = StringMapWrapper.create();
|
var handlers = StringMapWrapper.create();
|
||||||
StringMapWrapper.set(handlers, 'click', (e, view) => { called = true;});
|
StringMapWrapper.set(handlers, eventName, eventHandler);
|
||||||
var pv = new ProtoView(null, null, null);
|
var pv = new ProtoView(null, null, null);
|
||||||
pv.eventHandlers = [handlers];
|
pv.eventHandlers = [handlers];
|
||||||
var view = new View(pv, null, MapWrapper.create());
|
var view = new View(pv, null, MapWrapper.create());
|
||||||
var preBuildObject = new PreBuiltObjects(view, null, null, null);
|
return new PreBuiltObjects(view, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
it('should be injectable and callable', () => {
|
||||||
|
var called = false;
|
||||||
|
var preBuildObject = createpreBuildObject('click', (e, view) => { called = true;});
|
||||||
var inj = injector([NeedsEventEmitter], null, null, preBuildObject);
|
var inj = injector([NeedsEventEmitter], null, null, preBuildObject);
|
||||||
inj.get(NeedsEventEmitter).click();
|
inj.get(NeedsEventEmitter).click();
|
||||||
expect(called).toEqual(true);
|
expect(called).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be injectable and callable without specifying param type annotation', () => {
|
||||||
|
var called = false;
|
||||||
|
var preBuildObject = createpreBuildObject('click', (e, view) => { called = true;});
|
||||||
|
var inj = injector([NeedsEventEmitterNoType], null, null, preBuildObject);
|
||||||
|
inj.get(NeedsEventEmitterNoType).click();
|
||||||
|
expect(called).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
it('should be queryable through hasEventEmitter', () => {
|
it('should be queryable through hasEventEmitter', () => {
|
||||||
var inj = injector([NeedsEventEmitter]);
|
var inj = injector([NeedsEventEmitter]);
|
||||||
expect(inj.hasEventEmitter('click')).toBe(true);
|
expect(inj.hasEventEmitter('click')).toBe(true);
|
||||||
expect(inj.hasEventEmitter('move')).toBe(false);
|
expect(inj.hasEventEmitter('move')).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be queryable through hasEventEmitter without specifying param type annotation', () => {
|
||||||
|
var inj = injector([NeedsEventEmitterNoType]);
|
||||||
|
expect(inj.hasEventEmitter('click')).toBe(true);
|
||||||
|
expect(inj.hasEventEmitter('move')).toBe(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('property setter', () => {
|
describe('property setter', () => {
|
||||||
|
@ -577,7 +617,7 @@ export function main() {
|
||||||
component.setRole('button');
|
component.setRole('button');
|
||||||
component.setClass(true);
|
component.setClass(true);
|
||||||
component.classWithDashSetter(true);
|
component.classWithDashSetter(true);
|
||||||
component.setStyle('40px')
|
component.setStyle('40px');
|
||||||
component.setStyleWithUnit(50);
|
component.setStyleWithUnit(50);
|
||||||
|
|
||||||
expect(div.title).toEqual('foobar');
|
expect(div.title).toEqual('foobar');
|
||||||
|
@ -587,6 +627,16 @@ export function main() {
|
||||||
expect(DOM.getStyle(div, 'width')).toEqual('40px');
|
expect(DOM.getStyle(div, 'width')).toEqual('40px');
|
||||||
expect(DOM.getStyle(div, 'height')).toEqual('50px');
|
expect(DOM.getStyle(div, 'height')).toEqual('50px');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be injectable and callable without specifying param type annotation', () => {
|
||||||
|
var div = el('<div></div>');
|
||||||
|
var preBuildObject = new PreBuiltObjects(null, new NgElement(div), null, null);
|
||||||
|
var inj = injector([NeedsPropertySetterNoType], null, null, preBuildObject);
|
||||||
|
var component = inj.get(NeedsPropertySetterNoType);
|
||||||
|
component.setProp('foobar');
|
||||||
|
|
||||||
|
expect(div.title).toEqual('foobar');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('static', () => {
|
describe('static', () => {
|
||||||
|
|
Loading…
Reference in New Issue