2014-05-13 1 views
0

Ссылка на вопрос Trying to Migrate to Iron-Router from Router. Я до сих пор не понимаю, как переносить метеоритный маршрутизатор на железный маршрутизатор. Я использую маршрутизатор в моем проекте метеор. Файл маршрутизатор, как следующие:Как мигрировать из метеоритного маршрутизатора в IR (Iron 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; 
    } 
    } 

Как вы знаете, железо-роутер должен предоставить шаблон в начале. но с маршрутизатором я могу вернуть динамические шаблоны. Как железо-маршрутизатор реализует эту идею.

ответ

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); 
    } 

}); 
+0

Благодаря @boingy, и я встречаю мало-мальски сложного маршрута материал. Я обновился до вопросов, не могли бы вы посмотреть? – Pocky

+0

добавил код на то, что я хотел бы попробовать. Мне сложно понять, будет ли это работать, потому что он основан на фрагменте. Все концепции должны быть там, хотя вы должны иметь возможность получить его с помощью нескольких настроек: – shambles

+0

также обратите внимание на то, что нет необходимости использовать контроллеры, но из-за их малой нагрузки они рекомендуются. – kaytrance

 Смежные вопросы

  • Нет связанных вопросов^_^