【问题标题】:Controller/route conventions for nested routes in emberember 中嵌套路由的控制器/路由约定
【发布时间】:2015-01-22 09:26:02
【问题描述】:

我在我的 ember 应用程序中有一个嵌套路由的资源:

router.js:

Router.map(function() {
  this.resource('posts', function () {
    this.route('show',  {path: '/:id'});
  });
});

我的控制器在 ember 中的约定是什么?我是为每个 URL 创建一个单独的文件,还是 show 处理程序进入 /controllers/posts.js?还是有多种正确的方法可以做到这一点?

这是我目前在 /routes/posts.js 中的内容:

import Ember from 'ember';

var PostsRoute = Ember.Route.extend({
  model: function() {
    return posts;
  }
});

var posts = [
  {
    id: '1',
    title: 'Object nr one',
    content: 'This is the content of Object nr one.'
  },
  {
    id: '2',
    title: 'Obelix',
    content: 'A fat gaul. From a comic book.'
  },
  {
    id: '3',
    title: 'Werner',
    content: 'Wat soek werner hier? Dis mos nou belaglik man.'
  }
];

export default PostsRoute;

这是/controllers/posts.js:

import Ember from "ember";

export default Ember.ArrayController.extend({});

如果有人在这个例子中向我展示了正确的做事方式,我将不胜感激。我真的很难在网上找到合适的例子。

请注意,我使用的是 ember CLI

【问题讨论】:

  • 你应该在 routes/posts/show.js 中创建显示路由
  • 那么索引路由应该是什么?路线/帖子/index.js?还是路由/posts.js? @blessenm
  • 它将是 routes/posts/index.js guides.emberjs.com/v2.15.0/tutorial/subroutes

标签: javascript ember.js url-routing ember-cli


【解决方案1】:

“显示处理程序”从不进入控制器文件,而是Route。您为每个 resourceroute 指令创建单独的路由、控制器、模板。您可以告诉控制器它应该具有与其他控制器相同的行为,或者使用 mixin。例如:

router.coffee:

@resource 'training', ->
      @route 'chest'
      @route 'shoulders'

表示您需要以下结构:

app/routes/training[你的父资源]/chest.js[你的子路由] app/routes/training/shoulders.js

如果您需要每个路由的控制器,则需要具有以下路径的文件:

app/controllers/training/chest.js app/controllers/training/shoulders.js

和模板:

app/templates/training/chest.js 应用程序/模板/培训/shoulders.js

这是因为我已将 training 定义为资源(​​父级)并将路由定义为其子级。

如果您使用 Ember CLI,您可以使用以下命令:

ember g 控制器训练/肩膀

或:

ember g 路线训练/肩部

最后一个命令将为您生成:router.js 中的路由、模板和条目。你可以使用这个命令,这样你就不用太担心你的目录结构了。 但是,重要要记住,当您在资源中定义资源时 - 子资源并不是真正的子资源,不应将其放置在父资源目录中。例如:

@resource 'tracks', ->
  @resource 'track', path: '/track/:track_id', ->
    @route 'edit'

意味着您需要 2 个目录来存储路由文件:

  1. 应用程序/路线/轨道/
    • index.js
  2. 应用程序/路线/轨道/
    • edit.js

而不是 app/routes/tracks/track/edit。 因此,在您的示例中,对于以下路由器:

Router.map(function() {
  this.resource('posts', function () {
    this.route('show',  {path: '/:id'});
  });
});

应用程序/路由应如下所示:

app/routes:
 - posts.js # main route for whole resource
 - posts/ # directory which contains files for routes inside posts resource
   - show.js # posts/show route

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多