mdDialog 中的 angular2 路由

标签 angular angular-material

我正在尝试在 mdDialog 中进行路由, 这是 pnlkr: https://plnkr.co/edit/iTtq3HtDim0OsnJPKmW2?p=preview

我创建了两个对话框,例如,当我单击哪些照片时,它应该在同一对话框中打开用户的照片。

module.ts:

 import { RouterModule, Routes } from '@angular/router';
    const appRoutes: Routes = [
      { path: '', component: DialogOverviewExample },
      {
    path: 'photos',
    component: DialogOver,
  },

  { path: '**', component: DialogOverviewExample }
];

其中“照片”是包含照片的对话框。

在第一个对话框中,我将 routerLink 设置为名为“whatch photos”的按钮:

<div md-dialog-actions>
  <button md-button routerLink="/photos"  tabindex="2">Watch Photos</button>
  <button md-button (click)="onNoClick()" tabindex="-1">No Thanks</button>
</div>

它应该打开第二个带有照片的对话框,但它没有...... 并且出现错误:

ERROR Error: No provider for Router!

整个模块.ts

import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {BrowserModule} from '@angular/platform-browser';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {NgModule} from '@angular/core';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import { RouterModule, Routes } from '@angular/router';
import { SelectivePreloadingStrategy } from './selective-preloading-strategy';
import {
  MdAutocompleteModule,
  MdButtonModule,
  MdButtonToggleModule,
  MdCardModule,
  MdCheckboxModule,
  MdChipsModule,
  MdDatepickerModule,
  MdDialogModule,
  MdExpansionModule,
  MdGridListModule,
  MdIconModule,
  MdInputModule,
  MdListModule,
  MdMenuModule,
  MdNativeDateModule,
  MdPaginatorModule,
  MdProgressBarModule,
  MdProgressSpinnerModule,
  MdRadioModule,
  MdRippleModule,
  MdSelectModule,
  MdSidenavModule,
  MdSliderModule,
  MdSlideToggleModule,
  MdSnackBarModule,
  MdSortModule,
  MdTableModule,
  MdTabsModule,
  MdToolbarModule,
  MdTooltipModule,
  MdStepperModule,
} from '@angular/material';
import {DialogOverviewExample, DialogOverviewExampleDialog, DialogOver} from './dialog-overview-example';
import {HttpModule} from '@angular/http';
import {CdkTableModule} from '@angular/cdk/table';


const appRoutes: Routes = [
  { path: '', component: DialogOverviewExample },
  {
    path: 'photos',
    component: DialogOver,
  },

  { path: '**', component: DialogOverviewExample }
];



@NgModule({
  exports: [
    CdkTableModule,
    MdAutocompleteModule,
    MdButtonModule,
    MdButtonToggleModule,
    MdCardModule,
    MdCheckboxModule,
    MdChipsModule,
    MdStepperModule,
    MdDatepickerModule,
    MdDialogModule,
    MdExpansionModule,
    MdGridListModule,
    MdIconModule,
    MdInputModule,
    MdListModule,
    MdMenuModule,
    MdNativeDateModule,
    MdPaginatorModule,
    MdProgressBarModule,
    MdProgressSpinnerModule,
    MdRadioModule,
    MdRippleModule,
    MdSelectModule,
    MdSidenavModule,
    MdSliderModule,
    MdSlideToggleModule,
    MdSnackBarModule,
    MdSortModule,
    MdTableModule,
    MdTabsModule,
    MdToolbarModule,
    MdTooltipModule,
    RouterModule,
  ]
})
export class PlunkerMaterialModule {}

@NgModule({

  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    FormsModule,
    HttpModule,
    PlunkerMaterialModule,
    MdNativeDateModule,
    ReactiveFormsModule,

  ],

  declarations: [DialogOverviewExample, DialogOverviewExampleDialog, DialogOver],
  bootstrap: [DialogOverviewExample, DialogOverviewExampleDialog, DialogOver],
  providers: [
   RouterModule
  ],
})
export class PlunkerAppModule {}

platformBrowserDynamic().bootstrapModule(PlunkerAppModule);

最佳答案

我在您的代码中发现了一些导致该问题的问题:

  1. RouterModule 放置错误(请注意,RouterModuleNgModule不是 提供商)
  2. 对话框没有 entryComponents(因为它们是动态渲染的)
  3. 缺少router-outlet(@SalimIbrogimov 所说的,但他将该元素放置在对话框的错误部分)

这是更新后的代码:

main.ts:

const appRoutes: Routes = [
    {
        path: 'photos',
        component: DialogOver,
    }
];

@NgModule({
    imports: [
        BrowserModule,
        BrowserAnimationsModule,
        FormsModule,
        HttpModule,
        PlunkerMaterialModule,
        MdNativeDateModule,
        ReactiveFormsModule,
        // Over here
        RouterModule.forRoot(appRoutes)

    ],

    declarations: [
        DialogOverviewExample,
        DialogOverviewExampleDialog,
        DialogOver
    ],
    bootstrap: [
        DialogOverviewExample
    ],
    entryComponents: [
        DialogOverviewExampleDialog,
        DialogOver
    ]
})
export class PlunkerAppModule {}

dialog-overview-example-dialog.html:

<h3 md-dialog-title>Test</h3>
<div md-dialog-content>
    <router-outlet></router-outlet>
</div>
<div md-dialog-actions *ngIf="router.url != '/photos'">
    <button md-button routerLink="/photos"  tabindex="2">Watch Photos</button>
    <button md-button (click)="onNoClick()" tabindex="-1">No Thanks</button>
</div>

dialog-overview-example.ts:[摘录]

@Component({
    selector: 'dialog-overview-example-dialog',
    templateUrl: 'dialog-overview-example-dialog.html',
})
export class DialogOverviewExampleDialog {

    constructor(
        public dialogRef: MdDialogRef<DialogOverviewExampleDialog>, @Inject(MD_DIALOG_DATA) public data: any, public router: Router) {}
    onNoClick(): void {
        this.dialogRef.close();
    }

}

Updated plunker

关于mdDialog 中的 angular2 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46379138/

相关文章:

ruby-on-rails - Rails 5.1 Angular templateUrl

没有按钮的 Angular Material 基本 snackbar

css - Material 设计组件 - 在卡片中添加宽度和高度时出现问题

angular - 模板驱动表单和使用服务的响应式(Reactive)表单之间的区别

angular - 动态设置所选 Material 芯片的背景颜色会导致 ExpressionChangedAfterItHasBeenCheckedError

javascript - 为什么我们将 `(keyup)` 分配给模板局部变量的随机值以在 Angular2 中更新

angular - 类型 'void' 不可分配给类型 'any[]'

javascript - Angular 2 中组件模板之外的 routerLink,在基本 html 中

angular - Datepipe Angular 2 未显示正确的结果

Angular 2 Material 设计 <mat-expansion-panel> 全部展开/全部折叠