【问题标题】:Self nested infinite routes in Ember.jsEmber.js 中的自嵌套无限路由
【发布时间】:2015-03-18 20:11:49
【问题描述】:

我想用 Ember.js 制作一种目录结构。

以下是 url 的示例:folder/1/folder/44/document/3

如您所见,一个文件夹可以包含多个文件夹,也可以包含文档。我想知道我应该如何在我的路由器中处理这样的事情,因为事先我的应用程序不知道文件夹中是否有其他文件夹或只有文档。

我认为我需要制作单独的路由而不是嵌套路由:

App.Router.map(function() {
  this.route('folder', {path: 'folder/:folder_id'}); // -> FolderRoute
  this.route('document', {path: 'document/:document_id'}); // -> DocumentRoute
});

当文件夹或文档有父文件夹时,父文件夹的 ID 将在后端的数组中给出。

让我们以我的示例网址为例。最深的嵌套模型是一个 id 为 3 的文档。此文档模型的文件夹 ID 为 44,文件夹 44 的 parent_folder_ids 为 [1]。不知何故,我的路由器需要知道它必须从中生成示例 url。

我已经看到可以使用 router.generate 来生成 url,但我不确定这是否是我需要的,或者 queryParams 是否是最好的解决方案。

(https://github.com/tildeio/router.js#generating-urls)

【问题讨论】:

  • 你需要这样的 url 结构吗?您可以递归地浏览您的文件夹,直到在路由文件中找到您想要的文件夹。因此,如果您总是知道最高的父母,您的网址将只是 folder/44/document/3 甚至只是 document/3
  • 我同意@rogMaHall。此外,限制为 1 级会使事情变得更干净。另见weblog.jamisbuck.org/2007/2/5/nesting-resources。顺便说一句,我会递归地获取父资源,而不是一次将它们全部返回到一个数组中。

标签: ember.js nested ember-cli nested-routes


【解决方案1】:

(@MikeGrassotti 给了我这个灵感,因为他说他认为可以做到(here),所以我开始挖掘。:))

为此,您需要使用星形细分而不是动态细分。基本上,您在路径上指定 * 并且路由器知道根据文档 (here) 会期待“任何东西”,包括常规动态段不允许的斜线:

动态段匹配除 / 之外的任何字符。

因此我们可以如下定义路由器:

App.Router.map(function() {
  this.route('folder', {path: 'folder/*path'}, function(){
    this.route('document', {path: 'document/:document_id'});    
  });  
});

document 路由嵌套在folder 路由内,并且有一个常规的动态段。另一方面,folder 路由定义了一个时髦的*path,它基本上可以是任何以folder/ 开头的东西。

FolderRoute 中,我们需要通过获取路径的最后一部分(不包括斜杠)来隔离文件夹ID,然后按如下方式查找子文件夹和/或文档:

App.FolderRoute = Ember.Route.extend({
  model: function(params){
    var lastSlash = params.path.lastIndexOf('/');
    var folder_id = params.path.substr(lastSlash + 1);
    var folder = App.FILE_STRUCTURE.findBy('folder_id', folder_id);    

    Ember.set(folder, 'currentPath', params.path);

    return folder;
  }
});

我们还需要记住最近的路径,因为我们需要使用它来访问子文件夹。

我们过渡到路线将如下所示:

var newPath = this.get('currentPath') + "/folder/" + folder;
this.transitionToRoute('folder', newPath);

查看工作演示here

【讨论】:

  • 哇,这正是我想要的。我也发现了这个问题,但不确定如何完全解决。那谢谢啦!这对我有很大帮助:)
猜你喜欢
  • 2013-01-16
  • 2012-11-18
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多