X Tutup
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion modules/angular1_router/src/ng_outlet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,12 @@ function ngOutletDirective($animate, $q: ng.IQService, $router) {
}

this.controller.$$routeParams = instruction.params;
this.controller.$$template = '<div ' + dashCase(componentName) + '></div>';
this.controller.$$template =
'<' + dashCase(componentName) + ' router="$$router"></' + dashCase(componentName) + '>';
this.controller.$$router = this.router.childRouter(instruction.componentType);

let newScope = scope.$new();
newScope.$$router = this.controller.$$router;

let clone = $transclude(newScope, clone => {
$animate.enter(clone, null, this.currentElement || element);
Expand Down
87 changes: 62 additions & 25 deletions modules/angular1_router/test/integration/navigation_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,21 @@ describe('navigation', function () {
$router = _$router_;
});

registerComponent('userCmp', {
registerDirective('userCmp', {
template: '<div>hello {{userCmp.$routeParams.name}}</div>'
});
registerComponent('oneCmp', {
registerDirective('oneCmp', {
template: '<div>{{oneCmp.number}}</div>',
controller: function () {this.number = 'one'}
});
registerComponent('twoCmp', {
registerDirective('twoCmp', {
template: '<div>{{twoCmp.number}}</div>',
controller: function () {this.number = 'two'}
});
registerComponent('threeCmp', {
template: '<div>{{$ctrl.number}}</div>',
controller: function () {this.number = 'three'}
});
});

it('should work in a simple case', function () {
Expand All @@ -47,6 +51,21 @@ describe('navigation', function () {
expect(elt.text()).toBe('one');
});


it('should work with components created by the `mod.component()` helper', function () {
compile('<ng-outlet></ng-outlet>');

$router.config([
{ path: '/', component: 'threeCmp' }
]);

$router.navigateByUrl('/');
$rootScope.$digest();

expect(elt.text()).toBe('three');
});


it('should navigate between components with different parameters', function () {
$router.config([
{ path: '/user/:name', component: 'userCmp' }
Expand All @@ -68,7 +87,7 @@ describe('navigation', function () {
function ParentController() {
instanceCount += 1;
}
registerComponent('parentCmp', {
registerDirective('parentCmp', {
template: 'parent { <ng-outlet></ng-outlet> }',
$routeConfig: [
{ path: '/user/:name', component: 'userCmp' }
Expand All @@ -94,7 +113,7 @@ describe('navigation', function () {


it('should work with nested outlets', function () {
registerComponent('childCmp', {
registerDirective('childCmp', {
template: '<div>inner { <div ng-outlet></div> }</div>',
$routeConfig: [
{ path: '/b', component: 'oneCmp' }
Expand All @@ -114,7 +133,7 @@ describe('navigation', function () {


it('should work with recursive nested outlets', function () {
registerComponent('recurCmp', {
registerDirective('recurCmp', {
template: '<div>recur { <div ng-outlet></div> }</div>',
$routeConfig: [
{ path: '/recur', component: 'recurCmp' },
Expand Down Expand Up @@ -163,7 +182,7 @@ describe('navigation', function () {


it('should change location to the canonical route with nested components', inject(function ($location) {
registerComponent('childRouter', {
registerDirective('childRouter', {
template: '<div>inner { <div ng-outlet></div> }</div>',
$routeConfig: [
{ path: '/new-child', component: 'oneCmp', name: 'NewChild'},
Expand Down Expand Up @@ -208,7 +227,7 @@ describe('navigation', function () {

it('should expose a "navigating" property on $router', inject(function ($q) {
var defer;
registerComponent('pendingActivate', {
registerDirective('pendingActivate', {
$canActivate: function () {
defer = $q.defer();
return defer.promise;
Expand All @@ -227,36 +246,54 @@ describe('navigation', function () {
expect($router.navigating).toBe(false);
}));

function registerComponent(name, options) {
var controller = options.controller || function () {};

['$routerOnActivate', '$routerOnDeactivate', '$routerOnReuse', '$routerCanReuse', '$routerCanDeactivate'].forEach(function (hookName) {
if (options[hookName]) {
controller.prototype[hookName] = options[hookName];
}
});

function registerDirective(name, options) {
function factory() {
return {
template: options.template || '',
controllerAs: name,
controller: controller
controller: getController(options)
};
}
applyStaticProperties(factory, options);
$compileProvider.directive(name, factory);
}

if (options.$canActivate) {
factory.$canActivate = options.$canActivate;
}
if (options.$routeConfig) {
factory.$routeConfig = options.$routeConfig;
}
function registerComponent(name, options) {

$compileProvider.directive(name, factory);
var definition = {
template: options.template || '',
controller: getController(options),
}
applyStaticProperties(definition, options);
$compileProvider.component(name, definition);
}

function compile(template) {
elt = $compile('<div>' + template + '</div>')($rootScope);
$rootScope.$digest();
return elt;
}

function getController(options) {
var controller = options.controller || function () {};
[
'$routerOnActivate', '$routerOnDeactivate',
'$routerOnReuse', '$routerCanReuse',
'$routerCanDeactivate'
].forEach(function (hookName) {
if (options[hookName]) {
controller.prototype[hookName] = options[hookName];
}
});
return controller;
}

function applyStaticProperties(target, options) {
['$canActivate', '$routeConfig'].forEach(function(property) {
if (options[property]) {
target[property] = options[property];
}
});
}
});

78 changes: 63 additions & 15 deletions modules/angular1_router/test/integration/router_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,36 +44,84 @@ describe('router', function () {
expect(elt.text()).toBe('Home');
}));

function registerComponent(name, options) {
var controller = options.controller || function () {};

['$onActivate', '$onDeactivate', '$onReuse', '$canReuse', '$canDeactivate'].forEach(function (hookName) {
if (options[hookName]) {
controller.prototype[hookName] = options[hookName];
}
it('should bind the component to the current router', inject(function($location) {
var router;
registerComponent('homeCmp', {
bindings: { router: '=' },
controller: function($scope, $element) {
this.$routerOnActivate = function() {
router = this.router;
};
},
template: 'Home'
});

registerComponent('app', {
template: '<div ng-outlet></div>',
$routeConfig: [
{ path: '/', component: 'homeCmp' }
]
});

compile('<app></app>');

$location.path('/');
$rootScope.$digest();
var homeElement = elt.find('home-cmp');
expect(homeElement.text()).toBe('Home');
expect(homeElement.isolateScope().$ctrl.router).toBeDefined();
expect(router).toBeDefined();
}));

function registerDirective(name, options) {
function factory() {
return {
template: options.template || '',
controllerAs: name,
controller: controller
controller: getController(options)
};
}
applyStaticProperties(factory, options);
$compileProvider.directive(name, factory);
}

if (options.$canActivate) {
factory.$canActivate = options.$canActivate;
}
if (options.$routeConfig) {
factory.$routeConfig = options.$routeConfig;
}
function registerComponent(name, options) {

$compileProvider.directive(name, factory);
var definition = {
bindings: options.bindings,
template: options.template || '',
controller: getController(options),
}
applyStaticProperties(definition, options);
$compileProvider.component(name, definition);
}

function compile(template) {
elt = $compile('<div>' + template + '</div>')($rootScope);
$rootScope.$digest();
return elt;
}
});

function getController(options) {
var controller = options.controller || function () {};
[
'$routerOnActivate', '$routerOnDeactivate',
'$routerOnReuse', '$routerCanReuse',
'$routerCanDeactivate'
].forEach(function (hookName) {
if (options[hookName]) {
controller.prototype[hookName] = options[hookName];
}
});
return controller;
}

function applyStaticProperties(target, options) {
['$canActivate', '$routeConfig'].forEach(function(property) {
if (options[property]) {
target[property] = options[property];
}
});
}
});
15 changes: 10 additions & 5 deletions npm-shrinkwrap.clean.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@
"version": "1.0.0"
},
"angular": {
"version": "1.4.8"
"version": "1.5.0-rc.2"
},
"angular-animate": {
"version": "1.4.8"
"version": "1.5.0-rc.2"
},
"angular-mocks": {
"version": "1.4.8"
"version": "1.5.0-rc.2"
},
"ansi": {
"version": "0.3.0"
Expand Down Expand Up @@ -5337,7 +5337,12 @@
"version": "1.0.0"
},
"ts-api-guardian": {
"version": "0.0.2"
"version": "0.0.2",
"dependencies": {
"typescript": {
"version": "1.7.3"
}
}
},
"ts2dart": {
"version": "0.7.19",
Expand Down Expand Up @@ -5823,5 +5828,5 @@
}
},
"name": "angular-srcs",
"version": "2.0.0-beta.1"
"version": "2.0.0-beta.2"
}
36 changes: 23 additions & 13 deletions npm-shrinkwrap.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
X Tutup