如何从流星路由器迁移到IR(铁路由器)?

时间:2014-05-13 08:19:34

标签: javascript node.js meteor router iron-router

参考问题Trying to Migrate to Iron-Router from Router。我还是不明白如何将流星路由器迁移到铁路由器。 我在我的流星项目中使用路由器。路由器文件如下:

Meteor.Router.add({
  "/settings": function() {
    if (!Roles.userIsInRole(Meteor.user(), ['admin'])) {
      return false;
    }
    return 'site_settings';
  },
  "/new_page": function() {
    if (!Roles.userIsInRole(Meteor.user(), ['admin'])) {
      return false;
    }
    return 'new_page';
  },
  "/navigation": function() {
    if (!Roles.userIsInRole(Meteor.user(), ['admin'])) {
      return false;
    }
    return 'navigation';
  },
  "/login": function() {
    return 'loginButtonsFullPage';
  },

  "/users": function() {
    if (!Roles.userIsInRole(Meteor.user(), ['admin'])) {
      return false;
    }
    return 'admin_users';
    }
});

如果有人知道如何使用铁路由器以正确的方式替换返回模板。非常感谢。   我遇到了一点复杂的路由器功能,我不知道如何解决它。代码就像:

"/": function() {

    // Don't render until we have our data
    if (!GroundDB.ready()) {
    //if (!Offline.subscriptionLoaded('pages') || !Offline.subscriptionLoaded('settings')) {
      return 'loadingpage';
    } else {
      var page_slug = utils.getSetting('indexPage');
      var page = Pages.findOne({slug: page_slug});
      if(!page) {
        page = Pages.findOne();
        // if pages dont have any public pages
        if (!page) {
          var isIndexPageInNav=Navigation.findOne({"location":"header_active","pages.slug":page_slug});
          // if index page slug in navigation that means the user dont have right to view this slides or the index page not exist
          if(isIndexPageInNav)
          return 'loginButtonsFullPage';
          else
          return '404';

        }
        else {

          page_slug = page.slug;
        }
      }
      Session.set("page-slug", page_slug);

      return page.template;
    }
  }

如你所知,铁路由器需要在开始时提供模板。但是使用路由器我可以返回动态模板。铁路由器如何实现这一想法。

1 个答案:

答案 0 :(得分:0)

Router.map(function() {
  //site_settings being the name of the template
  this.route('site_settings', {
    path: '/settings',
    action: function() {
      if (!Roles.userIsInRole(Meteor.user(), ['admin'])) {
        //if the conditional fails render a access_denied template
        this.render('access_denied');
      } else {
        //else continue normally rendering, in this case the 'site_settings'
        //template
        this.render();
      }
    }
  });

  this.route('loginButtonsFullPage', {
    path: '/login'
  });
});

注意,如果用户管理条件很多,你可以将其包含在控制器中并将其链接到所有相关路线,例如:

Router.map(function() {
  this.route('site_settings', {
    path: '/settings',
    controller: 'AdminController'
  });

  this.route('new_page', {
    path: '/new_page',
    controller: 'AdminController'
  });

  this.route('navigation', {
    path: '/navigation',
    controller: 'AdminController'
  });

  //etc...

  //don't need to add the controller for this one
  //since all users have access
  this.route('loginHuttonsFullPage', {
    path: '/login'
  });
});

AdminController = RouteController.extend({
  action: function() {
    if (!Roles.userIsInRole(Meteor.user(), ['admin'])) {
      this.render('access_denied');
    } else {
      this.render();
    }
  }
});

您希望在铁路由器中查看的其他一些内容是使用{{> yield}}和waitOn是必不可少的。

https://github.com/EventedMind/iron-router的文档将更好地解释这些概念,然后我可以在这里。

这是我尝试更复杂的路线。它可能无法正常工作,因为我可能误解了你在做什么,但关键的是用this.render(template_name)替换返回; waitOn而不是检查某些东西是否准备就绪(),将所有必需的订阅添加到waitOn,然后最后将所有逻辑添加到操作

//note: index is the name of the route, you do not actually need a template called index.
//in the previous examples where no template to render was returned then iron-router will
//look for a template with the same name as the route but in this route we will be providing
//it with a specific route name in all cases
this.route('index', {
  path: '/',
  //assuming GroundDB is a subscription e.g. GroundDB = Meteor.subscribe('groundDB');
  //I don't know what your page and nav subscriptions are called but you should wait on them too.
  //if you haven't assigned them to a variable do something like 
  //pageSubscription = Meteor.subscribe('pages');
  waitOn: [GroundDB, pageSubscription, navigationSub],
  //the template to load while the subscriptions in waitOn aren't ready.
  //note: this can be defined globally if your loading template will be the same
  //for all pages
  loadingTemplate: 'loadingpage',
  //here we evaluate the logic on which page to load assuming everything has loaded
  action: function() {
    var page_slug = utils.getSetting('indexPage');
    var page = Pages.findOne({slug: page_slug});

    if (!page) {
      var isIndexPageInNav = Navigation.findOne({"location":"header_active","pages.slug":page_slug});
      if(isIndexPageInNav)
        this.render('loginButtonsFullPage');
      else
        this.render('404');
    } else {
      page_slug = page.slug;
    }

    Session.set("page-slug", page_slug);
    this.render(page.template);
  }

});