fix(router): throw when generating non-terminal link

Closes #3979

Closes #4092
This commit is contained in:
Brian Ford 2015-09-09 07:49:02 -07:00
parent f91c087c46
commit 8aec215ca0
2 changed files with 28 additions and 4 deletions

View File

@ -200,6 +200,7 @@ export class RouteRegistry {
generate(linkParams: any[], parentComponent: any): Instruction {
let segments = [];
let componentCursor = parentComponent;
var lastInstructionIsTerminal = false;
for (let i = 0; i < linkParams.length; i += 1) {
let segment = linkParams[i];
@ -233,9 +234,26 @@ export class RouteRegistry {
}
segments.push(response);
componentCursor = response.componentType;
lastInstructionIsTerminal = response.terminal;
}
var instruction: Instruction = this._generateRedirects(componentCursor);
var instruction: Instruction = null;
if (!lastInstructionIsTerminal) {
instruction = this._generateRedirects(componentCursor);
if (isPresent(instruction)) {
let lastInstruction = instruction;
while (isPresent(lastInstruction.child)) {
lastInstruction = lastInstruction.child;
}
lastInstructionIsTerminal = lastInstruction.component.terminal;
}
if (!lastInstructionIsTerminal) {
throw new BaseException(
`Link "${ListWrapper.toJSON(linkParams)}" does not resolve to a terminal instruction.`);
}
}
while (segments.length > 0) {

View File

@ -79,9 +79,8 @@ export function main() {
expect(url).toEqual('first/one/second/two');
});
it('should geneate params as an empty StringMap when no params are given', () => {
registry.config(RootHostCmp,
new Route({path: '/test/...', component: DummyParentParamCmp, as: 'test'}));
it('should generate params as an empty StringMap when no params are given', () => {
registry.config(RootHostCmp, new Route({path: '/test', component: DummyCmpA, as: 'test'}));
var instruction = registry.generate(['test'], RootHostCmp);
expect(instruction.component.params).toEqual({});
});
@ -232,6 +231,13 @@ export function main() {
}
});
it('should throw when linkParams are not terminal', () => {
registry.config(RootHostCmp,
new Route({path: '/first/...', component: DummyParentCmp, as: 'first'}));
expect(() => { registry.generate(['first'], RootHostCmp); })
.toThrowError('Link "["first"]" does not resolve to a terminal instruction.');
});
it('should match matrix params on child components and query params on the root component',
inject([AsyncTestCompleter], (async) => {
registry.config(RootHostCmp, new Route({path: '/first/...', component: DummyParentCmp}));