如何在Aurelia的路线之间重复使用数据?

时间:2017-01-17 12:27:02

标签: aurelia aurelia-router

我在系统中有一个用户实体,以下路由从服务器获取它并显示其详细信息:

routerConfiguration.map([
  // ...
  {route: 'user/:id', name: 'user-details', moduleId: './user-details'}
]);

现在我想显示所显示用户的编辑表单。我有以下要求:

  1. 编辑表单应该有一个单独的URL地址,因此可以轻松地发送给其他人。
  2. 当用户单击用户详细信息页面上的编辑按钮时,编辑表单应使用已加载的用户实例(即,不应再次联系API以获取用户详细信息)。
  3. 当用户点击用户详细信息页面上的编辑按钮,然后点击浏览器中的后退按钮时,他应该会再次看到详细信息页面而没有编辑表单。
  4. 第一次尝试

    我尝试将编辑表单定义为单独的页面:

    routerConfiguration.map([
      // ...
      {route: 'user/:id/edit', name: 'user-edit', moduleId: './user-edit'}
    ]);
    

    这会传递#1和#3要求,但是在打开编辑表单时必须再次加载用户。

    我不知道如何在路线之间走私某些自定义数据。如果我可以将预加载的用户实例传递给编辑路径并且编辑组件将使用它或加载新的用户实例(如果没有给出)(例如用户直接访问URL),那将是完美的。我只找到了how to pass strings to the routes in a slighlty hacky way

    第二次尝试

    我决定在模态中显示编辑表单,并在有?action=edit GET参数时自动显示。该代码受thisthis问题的启发:

    export class UserDetails {
      // constructor
      activate(params, routeConfig) {
        this.user = /* fetch user */;
        this.editModalVisible = params.action == 'edit';
      }
    }
    

    当用户单击编辑按钮时,将执行以下代码:

    displayEditForm() {
      this.router.navigateToRoute('user/details', {id: this.user.id, action: 'edit'});
      this.editModalVisible = true;
    }
    

    这传递#1(编辑网址为user/123?action=edit)和#2(用户实例仅加载一次)。但是,当用户点击后退浏览器按钮时,网址会根据需要从user/123?action=edit更改为user/123,但我不知道如何检测它并隐藏编辑表单(不再调用activate方法)。因此,此解决方案未能满足#3要求。

    编辑:

    事实上,我发现我可以检测到URL更改并使用事件聚合器隐藏编辑表单:

    ea.subscribe("router:navigation:success", 
      (event) => this.editModalVisible = event.instruction.queryParams.action == 'edit');
    

    但是,我仍然想知道是否有更好的方法来实现这一目标。

    问题是

    如何以干净和直观的方式应对这种情况?

1 个答案:

答案 0 :(得分:3)

如何添加将用作模型的User类并使用依赖注入在视图模型中使用它?

export class User {
    currentUserId = 0;
    userData = null;

    retrieve(userId) {
        if (userId !== this.currentUserId) {
            retrieve the user data from the server;
            place it into this.userData;

        }

        return this.userData;
    }
}