Когато използвате регулярен израз в железния рутер, как да получите достъп до съвпадението?

Вместо да имам пет различни маршрута, се опитвам да комбинирам пет различни пътя в една функция, но все пак трябва да знам кой път съвпада. Така че, ако настроя маршрута си с помощта на регулярен израз:

Router.route(/^\/(accounts)|(contacts)|(forecasts)|(analytics)|(activities)/, function() {
    // which one did it match?
    console.log("matched "+this.params) //this returns an array of five params
}

как да се позова на съвпадащия параметър във функцията?

this.params връща масив от пет параметъра, като четири от тях са недефинирани, а другият съвпада, но кой от тях е дефиниран зависи от съвпадението, така че това не е много полезно.


person illuminaut    schedule 13.12.2014    source източник


Отговори (3)


Това е типичен сценарий за персонализиран маршрутен контролер на Iron.Router! Вижте ръководството тук, ако имате нужда някакъв код, кажи ми. ;)

[Редактиране]

  1. Първо, дефинирате контролер на маршрут за всички ваши сайтове, които наследяват от RouteController.

    BaseController = RouteController.extend({
        // Put repeating logic for your sites here
    });
    
  2. След това дефинирате маршрутите си отделно, а не чрез регулярен израз. Това е много по-модулно и поддържано. Големият момент тук е, че не е нужно да откривате чрез сложни функции кой сайт е актуален.

    Router.map(function(){
        this.route('accounts', {
            path: '/accounts'
        });
    });
    
  3. Сега дайте на вашите маршрути собствен контролер

    Router.map(function(){
        this.route('accounts', {
            path: '/accounts',
            controller: 'AccountsController'
        });
    });
    
  4. В този пример вашето AccountsController трябва да наследи новото ви BaseController. Поставете цялата си логика на маршрута, която е специфична само за този маршрут, във вашия AccountsController

    AccountsController = BaseController.extend({
        // Put your specific route logic here
    });
    
  5. Уверете се, че вашият BaseController се зарежда от meteor преди вашите маршрути. Вижте Meteor Ред за зареждане на файлове. Можете да направите нещо като следното

    client/routes
    client/routes/routes.js
    client/routes/controller/AccountsController.js
    client/routes/controller/BaseController.js
    
person Community    schedule 13.12.2014
comment
можеш ли да разшириш това малко? Проверих ръководството, но не съм сигурен как използването на персонализиран контролер за маршрут помага тук. - person illuminaut; 14.12.2014
comment
Благодаря ти. Това е полезно и виждам как това е по-добра структура в много отношения. Може да продължа напред, но това, което трябваше да спомена е, че използвам съвпадението на регулярния израз за шаблонен код в прототип. Вместо маршрут за обхващане на всички, знам предварително кои маршрути са валидни, но всички те използват един и същ мъниче. В крайна сметка може да преместя някои от тези пътища оттам, когато попълня тази част от приложението, но в началото искам нещо, което не се нуждае от много код и може лесно да бъде добавено/премахнато от, следователно регулярен израз. - person illuminaut; 14.12.2014

Все пак успях да използвам this.params, като пренаписах регулярния израз, както следва:

Router.route(/^\/(accounts|contacts|forecasts|analytics|activities)/, function() {
    console.log('matched: '+this.params[0]);
}

Не съм сигурен дали това е най-добрият начин за препратка към съвпадение на регулярен израз.

person illuminaut    schedule 13.12.2014
comment
Защо не използвате 5 различни маршрута? Това изглежда като по-малко четлива версия на същото нещо. - person stubailo; 13.12.2014
comment
Тъй като в крайната версия ще има много повтаряща се логика в различните маршрути. - person illuminaut; 13.12.2014

Мисля, че най-добрият начин да направите това е да използвате цикъл, за да дефинирате няколко маршрута.

_.each(["accounts", "contacts", "forecasts"], function (path) {
  Router.route(path, function () {
    // inside here you can reference path
  });
});

Използването на един маршрут с много несвързани пътища ми изглежда като хак.

person stubailo    schedule 13.12.2014