Angularjs @angular/router在angular.js应用程序内不工作
我正在一点一点地将一个大型angular.js应用程序(使用ui路由器)迁移到angular,我选择使用angular.js应用程序作为基础,一次一个地迁移不同的路由,这样一旦完成,我就可以立即将所有内容切换到angular 以下是我遵循的步骤: 在my main.ts文件中启动angular.js应用程序:Angularjs @angular/router在angular.js应用程序内不工作,angularjs,angular-ui-router,ng-upgrade,Angularjs,Angular Ui Router,Ng Upgrade,我正在一点一点地将一个大型angular.js应用程序(使用ui路由器)迁移到angular,我选择使用angular.js应用程序作为基础,一次一个地迁移不同的路由,这样一旦完成,我就可以立即将所有内容切换到angular 以下是我遵循的步骤: 在my main.ts文件中启动angular.js应用程序: export function bootstrapAngular(extra: StaticProvider[]): any { setAngularJSGlobal(angular)
export function bootstrapAngular(extra: StaticProvider[]): any {
setAngularJSGlobal(angular);
if (environment.production) {
enableProdMode();
}
return platformBrowserDynamic(extra)
.bootstrapModule(AppModule)
.catch(err => console.log(err));
}
const downgraded = angular
.module('downgraded', [downgradeModule(bootstrapAngular)])
.directive('appRoot', downgradeComponent({ component: RootComponent, propagateDigest: false }))
;
angular.bootstrap(document, ['app', downgraded.name]);
在my index.html中
<app id="app"></app>
到目前为止一切正常。我可以在angular.js应用程序中看到我的angular组件
当我向我的主根组件添加
我可以看到路由器出口渲染,但旁边什么也看不到,即使路由匹配
export const routes: Route[] = [
{ path: 'dashboard', component: TestComponent }
];
当我将浏览器指向/#/仪表板时,我看到的是路由器跟踪:
测试组件只是不渲染
我需要一些帮助,想不出还有什么可以尝试的。首先:如果你想混合并开始将ng1的部分移动到ngx,你需要像以前一样从ngx引导你的ng1应用程序,但不能降级:
platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
(<any>platformRef.instance).upgrade.bootstrap(document.body, ['nameOfNg1App']);
});
至于处理策略,我使用路径前缀将ng1和ngx路由分开,但如果需要,您可以选择更简单的分开方式:
import { UrlHandlingStrategy } from '@angular/router';
export class Ng1Ng2UrlHandlingStrategy implements UrlHandlingStrategy {
private ng1Urls: string[];
constructor() {
this.ng1Urls = [
'prefix1',
];
}
shouldProcessUrl(url) {
url = url.toString();
return this.ng1Urls.findIndex(ng1Url => new RegExp(`^\/${ng1Url}([|\?|\/](.*)){0,1}$`).test(url)) === -1;
}
extract(url) {
return url;
}
merge(url, whole) {
return url;
}
}
哦,出于某些原因,我不得不在运行hybrid时坚持使用#
URL
通过此设置,您可以启动一个ngx应用程序,该应用程序有一个运行ui路由器的容器。在ng1应用程序中,您可以使用降级的ngx组件和服务。
要使ngx路由和ng1路由并行,您的(ngx)app.component.html包括
<div ui-view></div>
<router-outlet></router-outlet>
您可以在此处找到此策略的更多详细信息:所涉及的解决方案:
- 彻底摆脱这一策略
- 禁用初始导航
- 在两种路由配置中创建空路由
- 在ng1应用程序中注入ng2路由器并添加以下逻辑
angular.module('app').config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) { $stateProvider.state('ng2', { }); $urlRouterProvider.otherwise(($injector, $location) => { const $state = $injector.get('$state'); const ng2Routes = ['dashboard']; const ng2Router = $injector.get('ng2Router'); const url = $location.url(); if (ng2Routes.some(feature => url.startsWith('/' + feature))) { $state.go('ng2'); ng2Router.navigate([url]); } else { $state.go('messages'); } }); }]);
@NgModule({
imports : [
RouterModule.forRoot(routes, {useHash: true})
],
exports : [
RouterModule
],
// provide custom UrlHandlingStrategy to separate AngularJs from Angular routes
providers: [
{
provide : UrlHandlingStrategy,
useClass: Ng1Ng2UrlHandlingStrategy
}
]
})
export class AppRoutingModule {
}
import { UrlHandlingStrategy } from '@angular/router';
export class Ng1Ng2UrlHandlingStrategy implements UrlHandlingStrategy {
private ng1Urls: string[];
constructor() {
this.ng1Urls = [
'prefix1',
];
}
shouldProcessUrl(url) {
url = url.toString();
return this.ng1Urls.findIndex(ng1Url => new RegExp(`^\/${ng1Url}([|\?|\/](.*)){0,1}$`).test(url)) === -1;
}
extract(url) {
return url;
}
merge(url, whole) {
return url;
}
}
<div ui-view></div>
<router-outlet></router-outlet>
angular.module('app').config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
$stateProvider.state('ng2', { });
$urlRouterProvider.otherwise(($injector, $location) => {
const $state = $injector.get('$state');
const ng2Routes = ['dashboard'];
const ng2Router = $injector.get('ng2Router');
const url = $location.url();
if (ng2Routes.some(feature => url.startsWith('/' + feature))) {
$state.go('ng2');
ng2Router.navigate([url]);
} else {
$state.go('messages');
}
});
}]);