【问题标题】:Override a route in Iron Router Meteor覆盖 Iron Router Meteor 中的路由
【发布时间】:2015-06-30 01:21:29
【问题描述】:

我尝试了两种方法。首先是定义一个具有相同模式的新路由,但它给了我一个错误,说“路径已经存在”。

然后我也尝试从路由器中获取现有的RouteController并进行更改,但并不顺利

具体来说,我正在尝试在项目 Telescope 中覆盖以下路线。

https://github.com/TelescopeJS/Telescope/blob/master/packages/telescope-posts/lib/routes.js#L159-L162

【问题讨论】:

  • 听起来你想使用 onBeforeAction 钩子 - github.com/iron-meteor/iron-router/blob/devel/… Iron Router 中只能定义一个特定的 path,但是该路径加载什么模板,该路径具有什么数据, etc可以在onBeforeAction中定义
  • 不是理想的方式,但它有效。在下面发布了解决方案。谢谢。

标签: node.js meteor iron-router telescope


【解决方案1】:

一种方法是修改现有的路线选项。

// Running it in Meteor.startup is only necessary because Telescope
// defines the route at startup
Meteor.startup(function () {
  // Find a route by name
  var route = Router.routes.posts_default;
  // OR find a route by path
  var route = Router.findFirstRoute('/');

  // Override existing route options
  _.extend(route.options, {
    data: //...
    // Other route options...
  });
});

另一种方法是删除路由并重新创建它。

使用通过名称删除路由的函数,

function removeRouteByName (routeName) {
  var routes = Router.routes;
  var route = routes[routeName];
  if (!route) return false;  // Returns false if route is not found

  // Remove route from Router
  delete routes[routeName];
  delete routes._byPath[route.path()];
  var routeIndex = routes.indexOf(route);
  if (routeIndex >= 0) routes.splice(routeIndex, 1);

  // Remove route handler from MiddleWareStack
  delete Router._stack._stack[routeName];
  Router._stack.length -= 1;

  return true;  // Returns true when route is removed
}

我们可以删除并重新创建路由

// Running it in Meteor.startup is only necessary because Telescope
// defines the route at startup
Meteor.startup(function () {
  removeRouteByName('posts_default');

  Router.route('/', {
    name: 'posts_default',  // Use the same name
    //Add your parameters...
  });
});

尝试在此repository 中运行 Telescope,您应该会看到路径 / 已更改。

【讨论】:

  • 试过但没有用,我应该从Meteor.startup 中删除它。 removeRouteByName 导致我出现日志异常。 Iron Router 也在维护一个Router.routes._byPath 数组,如果我们想删除一个路由,我们也应该更新这个数组。
  • 是的,它应该在Meteor.startup() 中删除,因为 Telescope 在那里定义了它。我修复了removeRouteByName() 并添加了repository 和一个工作示例。希望对您有所帮助!
【解决方案2】:

使用 onBeforeAction 钩子可以完成这项工作,虽然不是最好的方法。

Router.onBeforeAction(function () {
  if (Router.current().route.getName()==="posts_default") {
    this.render("posts_list_controller", {
      data: {
        terms: { // Telescope specific view data
          view: 'another_view',
          limit: 10
        }
      }
    });
  } else {
    this.next();
  }
});

【讨论】:

  • 在我看来,@xamfoo 上面的答案是一个更好的方法,如果它有效的话。
猜你喜欢
  • 2015-03-12
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多