Aurelia - 在路由器视图上禁用重置

Aurelia - disable reset on router-view

如果我在路由器视图上更改选项卡,我的表单会不断重置,有没有办法防止这种情况(如果不是,还有什么替代方法)

export class App {
configureRouter(config, router) {
config.title = "Aurelia";
config.map([
  { route: ["", "dashboard"], name: "dashboard", moduleId: "HTML/viewmodels/dashboard", nav: true, title: "Dashboard", settings: "icon-home" },
  { route: "addons", name: "addons", moduleId: "HTML/viewmodels/addons", nav: true, title: "Addons", settings: "icon-file" },
  { route: "error", name: "error", moduleId: "HTML/viewmodels/error", nav: true, title: "Error", settings: "icon-info-sign" }
]);

this.router = router;
console.log(router);
  }
}

这是一个状态持续存在的问题。最简单的解决方案是将状态存储在:

  • 父视图
  • 一个non-view相关单例class(或静态变量)
  • Localstorage 持久化(可能与之前的选项一致)

第一种方法:保存在父视图中

例如,您可以在 App class:

中创建缓存
export class App {
  formData = {};

  configureRouter(config, router) {
    { route: ["", "dashboard"], [..snip..] settings: { formData: this.formData, icon: 'icon-home' } }
  }
}

在您的视图中,您可以执行以下操作:

activate(params, routeConfig) {
  this.formData = routeConfig.settings.formData;
  this.icon = routeConfig.settings.icon;
}

并且在 HTML 中,只需将其绑定到 formData:

<input type="text" value.bind="formData.text" />

这种假设,整个 App 围绕着那个形式。否则,将它存储在那里真的没有多大意义。

无论如何,这是一种方法(我在列表中指出的第一个)。


另一种方式:单例。

创建一个名为 AppState 的新 class 或类似的东西。

export class AppState {
  formData = {};
}

那么在你看来,你应该导入并注入它:

import { AppState } from './app-state';

export class YourView {
  static inject = [AppState];

  constructor(appState) {
    this.appState = appState;
  }
}

然后在你的 HTML 中,你可以像这样绑定它:

<input type="text" value.bind="appState.formData.text" />

或者第三种方式:静态class.

创建一个名为 AppState 的新 class 或类似的东西。

export class AppState {
  static formData = {};
}

那么在你看来,你应该导入并注入它: 从'./app-state'导入{AppState};

export class YourView {
  AppState = AppState;
}

然后在你的 HTML 中,你可以像这样绑定它:

<input type="text" value.bind="AppState.formData.text" />