@ angular / router在angular.js应用程序中无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ angular / router在angular.js应用程序中无法正常工作相关的知识,希望对你有一定的参考价值。

我正在努力一点一点地将一个大的angular.js应用程序(使用ui-router)迁移到角度,我选择使用angular.js应用程序作为基础并一次迁移一个不同的路由,这样我曾经我完成了我立刻将所有东西切换到角度。

这些是我遵循的步骤:

在我的main.ts文件中引导angular.js应用程序:

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]);

在我的index.html里面

<app id="app"></app>

这很好用。

在我的主要angular.js组件中,我添加了降级后的主角度组件的标签:

<div class="app__view" id="appContent">
  <ui-view></ui-view>
  <app-root></app-root>
</div>

这就是我的主模块的配置方式

const COMPONENTS = [
  TestComponent,
  RootComponent,
];

@NgModule({
  declarations: COMPONENTS,
  imports: [
    BrowserModule,
    NxModule.forRoot(),
    RouterModule.forRoot(routes, {
      initialNavigation: 'enabled',
      useHash: true
    })
  ],
  providers: [
    { provide: APP_BASE_HREF, useValue: '/' }
  ],
  entryComponents: COMPONENTS,
  exports: COMPONENTS
})
export class AppModule {
  ngDoBootstrap(): void { }
}

到目前为止一切正常。我可以在angular.js应用程序中看到我的角度组件。

当我添加到我的主根组件时,问题就出现了,我可以看到路由器 - 出口渲染,但旁边没有,尽管路径匹配。

export const routes: Route[] = [
  { path: 'dashboard', component: TestComponent }
];

当我将浏览器指向/#/ dashboard时,这是我看到的路由器跟踪:

router tracing

并且测试组件不会呈现。

enter image description here

我需要一些帮助,想不出别的想法。

答案

首先:如果你想混合并开始将ng1的部分移动到ngx,你需要像你一样从ngx引导你的ng1应用程序,而不是通过降级:

platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
  (<any>platformRef.instance).upgrade.bootstrap(document.body, ['nameOfNg1App']);
});

您应该在app.component.html中为ui-router提供入口点:

<div ui-view></div>

您还需要提供URL处理策略来告知angular,要处理哪些路由。我有一个AppRoutingModule,它是由AppModule导入的。这个提供了处理程序:

@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 {
}

在处理策略中,我使用路径前缀将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;
    }
}

哦,由于某些原因,我不得不坚持使用# URL,同时运行混合。

通过此设置,您可以启动一个ngx应用程序,该应用程序具有运行ui-router的容器。在ng1应用程序中,您可以使用降级的ngx组件和服务。要并行使用ngx-routes和ng1路由,您的(ngx)app.component.html包含

<div ui-view></div>
<router-outlet></router-outlet>

您可以在此处找到此策略的更多详细信息:https://blog.nrwl.io/upgrading-angular-applications-upgrade-shell-4d4f4a7e7f7b

另一答案

解决方案包括:

  • 完全摆脱UrlHandlingStrategy
  • 禁用initialNavigation
  • 在两个路由配置中创建空路由
  • 在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'); } }); }]);

以上是关于@ angular / router在angular.js应用程序中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 中使用 router.navigateByUrl 和 router.navigate

如何安装和导入 angular 2 '@angular/router'?

ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢?

错误找不到模块'@angular/material

angular2 router.navigate 在 auth0 回调中

@ angular / router在angular.js应用程序中无法正常工作