Angular 路由:避免在更改 url 后破坏活动组件?

Angular Routing: Avoid destroy of active component after changing the url?

为了澄清/更好的问题:点击 `

[routerLink]="['/ComponentB']

将导致 ComponentB 的另一个实例显示在

<router-outlet></router-outlet>

我想避免这种行为,因为我喜欢重用一个应该链接到路由器插座的现成实例。


如果你有一个公式集合来处理几个 ng 组件,这些组件基于 class 对象的集合/数组构建,大约包含。 10 个道具包括输入值,标称值和至少单位和布尔值......,所以要保持页面状态(输入+结果)结束重复很多东西。

因此,我模拟了一个路由,使用*ngif来显示单个页面的相关部分(components),但没有改变url。

<div *ngIf="visibleComponentA>
... All part of ComponetA 
  ></div>

CpmponetA.html

<div *ngIf="visibleComponentB>
... All part of ComponetB 
  ></div>

CpmponetB.html

这个布尔值将在组件的相关代码中设置:

@Input()visibleComponentA: boolean = true; 

ComponetA.ts

现在在首页

<div (click)="OnClickNav(visibleComponentA)" >ComponentA</div>
<div (click)="OnClickNav(visibleComponentB)" >ComponentB</div> 

app.component.html

和方法OnClickNav(Selected:NavFlags)切换组件的正确可见状态。

OnClickNav(Selected:NavFlags){

    Selected.NavStatus=!Selected.NavStatus

    Selected.NavItem=='visibleComponetA'? this.visibleComponetA.NavStatus=Selected.NavStatus: this.visibleComponetA.NavStatus= false;
    Selected.NavItem=='visibleComponetB'? this.visibleComponetB.NavStatus=Selected.NavStatus: this.visibleComponetB.NavStatus= false;

app.commonet.ts

classNavFlags很简单

export class NavFlags {
  NavItem: string = '';
  NavStatus: boolean = false;

  constructor(NavItem: string, NavStatus: boolean) {
    this.NavItem = NavItem;
    this.NavStatus = NavStatus;
  }
}

导航-flags.ts

这样“个人”页面将不会留下任何数据丢失。我没有重复的商店。 完整的例子可以访问https://angulartool.de。 通过单击该按钮,可以在不丢失数据的情况下浏览组件中的页面。

这个 hack 并不完美,所以也许会有更好的方法来解决这个 angular 问题。

要一次在一个页面上显示两个组件,您可以使用不同的 outlets

const routes: Routes = [
  { path: 'A', component: AComponent },
  { path: 'B', component: BComponent, outlet: 'secondRouter' }
]; 

在你的 HTML:

<router-outlet></router-outlet>
<router-outlet name='secondRouter'></router-outlet>

查看此 StachBlitz 了解更多详情。

我认为这可能是一个比看起来更严重的问题。但是,仍然有希望,我希望您遵循 Angular 指南并相应地构建组件,并在您的路由配置中拥有一个组件为 entryComponent 的模块。

entryComponent 将是您模块的主要入口组件,您可以在路由时存储组件信息。

所以也许你可以尝试在主组件中创建组件,主组件将保留它创建的组件的信息。

但请注意,如果您在模块之间切换,这将不起作用。

另一种可能的解决方案是利用服务来存储您需要的数据。

这个组件:Kragarm

   ...
 
     public W = new VariableUnitBuilder('W', 'mm³', 0, 'Widerstandsmoment', 'W', false,'xW',false, 'Wy','Wx');
...
        ngOnInit(): void {
        
        
            /*Staffolding the Html */
        
            this.variableList.push(
              this.F,  this.L,
              'br',
              this.Mt, this.Szul,

          'br',
          this.Werf, this.W, 'br', this.S,
              'br',
              this.factor,  this.fzul,
              'br',
              this.Ierf, this.I,
              'br',
              this.f,      
              'br'
            );
          
        
        
            if ( this.storeVar[this.RouteName+'Count'] < 1){ this.storeVar[this.RouteName] =this.variableList}
            this.variableList= this.storeVar.Kragarm
            this.storeVar[this.RouteName+'Count']++
            this.BerechnungsName = this.htmlButtonName;
        
        
          } // END OF ON IN

Kragarm.component.ts

这是 VariableUnitBuilder 的接口

export interface IVariableUnitBuilder {

  varName: string;
  varLabel: string;
  varSymbol: string;

  unitBase: string;
  unit: string;
  scaleSelect: number;

  inputStr: string;
  inputValue: number;
  nominalValue: number;
  ergebnis: boolean;
  showStr: string;
  showValue: number;
  nominalValueOld: number;

  fixActiv: boolean;
  fixStatus: boolean;

  fixLabelStr: string;
  fixTrueLabel: string;
  fixFalseLabel: string;

  fixGroup: string;

}

这是服务:

import { Injectable } from '@angular/core';
import {IVariableUnitBuilder} from "../../../shared/_intefaces/IVariableUnitBuilder";

@Injectable({
  providedIn: 'root'
})
export class BiegebalkenService {
public Kragarm: IVariableUnitBuilder[]
public KragarmCount: number=0
constructor() { }
}

Biegeblaken.service.ts(旁边洒childBiegebalken.module.ts)

这是组件 Kragarm.component.ts

的相关 HTML

...

<table *ngFor="let variable of  variableList; let i =   index ">
      <tr *ngIf="  (variable).varName !=  undefined ">
  <td class="Spalte1">
          <input
            [(ngModel)]='variable.varLabel'
            class='inputLabel'
            jgInputStringRestriction
          >
        </td>

..... Kragarm.component.html

这是主要HTML变成app.component.html

...
    <div [routerLink]="['/Kragarm']" class="Route">Kragarm</div>
...

app.component.ts

非常感谢您的支持和评论