Skip to content

Commit cb57ce9

Browse files
fix(Resolve): Fix NOWAIT resolve injection into controllers and bindings to components.
1 parent 42e3a8c commit cb57ce9

File tree

2 files changed

+106
-8
lines changed

2 files changed

+106
-8
lines changed

src/services.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,13 @@ mod_init .run (runBlock);
135135
/** @hidden TODO: find a place to move this */
136136
export const getLocals = (ctx: ResolveContext) => {
137137
let tokens = ctx.getTokens().filter(isString);
138-
let tuples = tokens.map(key => [ key, ctx.getResolvable(key).data ]);
138+
139+
let tuples = tokens .map(key => {
140+
let resolvable = ctx.getResolvable(key);
141+
let waitPolicy = ctx.getPolicy(resolvable).async;
142+
return [ key, waitPolicy === 'NOWAIT' ? resolvable.promise : resolvable.data ]
143+
});
144+
139145
return tuples.reduce(applyPairs, {});
140146
};
141147

test/resolveSpec.ts

+99-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Spy = jasmine.Spy;
77
import "./util/matchers";
88
import { resolvedValue, resolvedError, caught } from './util/testUtilsNg1';
99
import { ResolveContext, State, PathNode, omit, pick, extend, forEach } from "../src/index";
10-
import { Resolvable, services, StateDeclaration } from "ui-router-core";
10+
import { UIRouter, Resolvable, services, StateDeclaration } from "ui-router-core";
1111
import "../src/legacy/resolveService";
1212

1313
let module = angular['mock'].module;
@@ -44,10 +44,6 @@ function getStates() {
4444
M: { resolve: { _M: function(_L) { counts['_M']++; return _L + "M"; }} }
4545
}
4646
},
47-
N: {
48-
resolve: { _N: function(_J) { return _J + "N"; }, _N2: function(_J) { return _J + "N2"; }, _N3: function(_J) { return _J + "N3"; } },
49-
resolvePolicy: { _N: "EAGER", _N2: "LAZY", _N3: "LAZY" }
50-
}
5147
},
5248
O: { resolve: { _O: function(_O2) { return _O2 + "O"; }, _O2: function(_O) { return _O + "O2"; } } },
5349
P: { resolve: { $state: function($state) { return $state } },
@@ -427,6 +423,21 @@ describe("$resolve", function () {
427423

428424
// Integration tests
429425
describe("Integration: Resolvables system", () => {
426+
beforeEach(module(function() {
427+
let app = angular.module('test', ['ui.router']);
428+
if (angular.version.minor >= 5) {
429+
app.component('nowait', {
430+
bindings: { wait: '<', nowait: '<' },
431+
template: '{{ $ctrl.wait }}-{{ $ctrl.data }}',
432+
controller: function () {
433+
this.$onInit = () => {
434+
this.nowait.then(result => this.data = result)
435+
}
436+
}
437+
});
438+
}
439+
}));
440+
430441
beforeEach(module(function ($stateProvider) {
431442
let copy = {};
432443
forEach(statesMap, (stateDef, name) => {
@@ -438,12 +449,16 @@ describe("Integration: Resolvables system", () => {
438449
});
439450
}));
440451

441-
let $state, $rootScope, $transitions, $trace;
442-
beforeEach(inject((_$state_, _$rootScope_, _$transitions_, _$trace_) => {
452+
beforeEach(module('test'));
453+
454+
let router: UIRouter, $state, $rootScope, $transitions, $trace, $q;
455+
beforeEach(inject((_$uiRouter_, _$state_, _$rootScope_, _$transitions_, _$trace_, _$q_) => {
456+
router = _$uiRouter_;
443457
$state = _$state_;
444458
$rootScope = _$rootScope_;
445459
$transitions = _$transitions_;
446460
$trace = _$trace_;
461+
$q = _$q_;
447462
}));
448463

449464

@@ -460,4 +475,81 @@ describe("Integration: Resolvables system", () => {
460475
expect($state.current.name).toBe("K");
461476
expect(counts._J).toEqualData(1);
462477
});
478+
479+
it("should inject a promise for NOWAIT resolve into a controller", inject(function($compile, $rootScope) {
480+
let scope = $rootScope.$new();
481+
let el = $compile('<div><ui-view></ui-view></div>')(scope);
482+
483+
let deferWait = $q.defer();
484+
let deferNowait = $q.defer();
485+
let onEnterNowait;
486+
487+
router.stateProvider.state({
488+
name: 'policies',
489+
resolve: [
490+
{ token: 'nowait', resolveFn: () => deferNowait.promise, policy: { async: 'NOWAIT' } },
491+
{ token: 'wait', resolveFn: () => deferWait.promise },
492+
],
493+
onEnter: function(nowait) {
494+
onEnterNowait = nowait;
495+
},
496+
controller: function($scope, wait, nowait) {
497+
$scope.wait = wait;
498+
nowait.then(result => $scope.nowait = result);
499+
},
500+
template: '{{ wait }}-{{ nowait }}'
501+
});
502+
503+
$state.go("policies");
504+
$q.flush();
505+
506+
expect($state.current.name).toBe("");
507+
508+
deferWait.resolve('wait for this');
509+
$q.flush();
510+
511+
expect($state.current.name).toBe("policies");
512+
expect(el.text()).toBe('wait for this-');
513+
expect(typeof onEnterNowait.then).toBe('function');
514+
515+
deferNowait.resolve('dont wait for this');
516+
$q.flush();
517+
518+
expect(el.text()).toBe('wait for this-dont wait for this');
519+
}));
520+
521+
if (angular.version.minor >= 5) {
522+
it("should bind a promise for NOWAIT resolve onto a component controller", inject(function ($compile, $rootScope) {
523+
let scope = $rootScope.$new();
524+
let el = $compile('<div><ui-view></ui-view></div>')(scope);
525+
526+
let deferWait = $q.defer();
527+
let deferNowait = $q.defer();
528+
529+
router.stateProvider.state({
530+
name: 'policies',
531+
resolve: [
532+
{ token: 'nowait', resolveFn: () => deferNowait.promise, policy: { async: 'NOWAIT' } },
533+
{ token: 'wait', resolveFn: () => deferWait.promise },
534+
],
535+
component: 'nowait'
536+
});
537+
538+
$state.go("policies");
539+
$q.flush();
540+
541+
expect($state.current.name).toBe("");
542+
543+
deferWait.resolve('wait for this');
544+
$q.flush();
545+
546+
expect($state.current.name).toBe("policies");
547+
expect(el.text()).toBe('wait for this-');
548+
549+
deferNowait.resolve('dont wait for this');
550+
$q.flush();
551+
552+
expect(el.text()).toBe('wait for this-dont wait for this');
553+
}));
554+
}
463555
});

0 commit comments

Comments
 (0)