代码之家  ›  专栏  ›  技术社区  ›  jelhan

在ember.js中组织列表、查看、创建和更新路由的最佳实践

  •  0
  • jelhan  · 技术社区  · 7 年前

    现在使用EMBE.JS工作了几年,对我来说还不太清楚,应该如何构造列表、查看、创建和更新路由。

    到目前为止,我参与的项目主要用于为每个实体路由树。用于列出的复数实体名和用于创建的子例程,以及用于编辑的子例程的详细视图的单数实体名。以a为例 post 模型将为路线提供这些: /posts 对于列出的帖子, /posts/new 对于创建功能, /post/:post_id 为了显示一个帖子 /post/:post_id/edit 因为编辑了那个。相应的路由器如下所示:

    Router.map(function() {
      this.route('post', { path: '/post/:post_id' }, function() {
        this.route('edit');
      });
      this.route('posts', function() {
        this.route('new');
      });
    });
    

    这种方法非常适合细节和编辑视图,因为它们共享同一个模型。因此,编辑路由的模型挂钩可以重用细节视图路由的模型。在灰烬代码中,如下所示:

    // app/routes/post.js
    import Route from '@ember/routing/route';
    
    export default Route.extend({
      model({ post_id }) {
        return this.get('store').findRecord('post', post_id);
      }
    });
    
    // app/routes/post/edit.js
    import Route from '@ember/routing/route';
    
    export default Route.extend({
      model() {
        return this.modelFor('post');
      }
    });
    

    通常我们会从 posts 路由模型钩子而不实现 posts.new 路由(或者根据体系结构返回pojo/changeset集,但这不是问题所在)。假设我们没有实现 新邮政 路线如下:

    // app/routes/posts.js
    import Route from '@ember/routing/route';
    
    export default Route.extend({
      model({ post_id }) {
        return this.get('store').findAll('post');
      }
    });
    
    // app/routes/posts/new.js
    import Route from '@ember/routing/route';
    
    export default Route.extend({
    });
    

    但现在这种方法已经不起作用了 新邮政 在收集 帖子 载入。因为我们不需要这个集合来创建帖子列表(至少如果我们只在 posts.index 这感觉不对。

    对于那些不太熟悉ember的人,需要注意的是:嵌套的路由模型钩子是按顺序执行的。所以在我们的例子中,首先是应用程序路由的模型钩子,然后发布路由,然后发布新路由,等待其中一个执行任何承诺。

    那么什么才是最佳实践呢?

    • 帖子的获取是否存在 邮政指数 路线如果我们不在嵌套路线上显示它们?
    • 创建路由不应该嵌套在列表路由下吗?所以我们应该 帖子 , post-new , 邮递 post.edit 路线?感觉很混乱,因为邮政相关的代码被分成三个路径树。这也违背了 improved file layout 目前正在开发,因为代码将被分成三个目录。
    • 我们是否应该权衡不必要地获取posts集合,因为大多数用户流都是在创建路由之前从这个路由来的,因此在大多数情况下模型钩子已经加载了?

    希望你能考虑一下。为了更好地记录答案,决定不在社区里问那个问题。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Trenton Trama    7 年前

    拥有一个 nested route 在ember中,将子路由的输出嵌套在父路由中。虽然您当前的结构可以工作,但它与ember具有结构化路由功能的方式并不完全匹配。

    您应该使用具有显式定义的单一嵌套路由 index route .

    在嵌套的每一级(包括顶层),烬 自动为/路径命名索引提供路由。看什么时候 出现新的嵌套级别时,请检查路由器,只要您看到 函数,这是一个新的级别。

    Router.map(function() {
      this.route('posts', function() {
        this.route('favorites');
      });
    });
    

    相当于

    Router.map(function() {
      this.route('index', { path: '/' });
      this.route('posts', function() {
        this.route('index', { path: '/' });
        this.route('favorites');
      });
    });
    

    如果您创建一个显式posts/index.js文件,它可以用作列表路由。这样做有助于避免在转换到创建路由之前获取所有帖子的问题。

    虽然不同于你目前的结构,我建议如下。

    Router.map(function() {
      this.route('posts', function() {
          this.route('index');  // /posts  - posts/index.js
          this.route('new');    // /posts/new - posts/new.js
          this.route('view', { path: '/:post_id' }  // /posts/1234 - posts/view.js
          this.route('edit', { path: '/:post_id/edit' }  // /posts/1234/edit - posts/edit.js
      }); 
    });
    

    根据新的和编辑中逻辑的复杂性,可以考虑将这两条路线合并为一个,或者在生成空模型之后简单地将新的转换为编辑。

    这样做的好处包括:

    简单性 你不必为所有路线重新定义路径。所有的东西都在posts/下面,路由指定了下一个部分。

    一致性 jsonapi模式使用 plural routes 用于获取集合和单个对象。

    逻辑包装 如果使用显式index.js文件,则可以使用旧posts.js文件作为post命名空间中所有项的公共包装。posts.js将有一个出口,将索引、新建、编辑和视图路由放入其中

    如果需要查看和编辑路线以共享同一模型生成,则可以将视图/编辑嵌套到一个公共组中,以便共享父模型。

    this.route('posts', function() {
        this.route('post', { path: '/:post_id' }, function() {
            this.route('view', { path: '/' }) ;
            this.route('edit', { path: '/edit' });
        })
    })