2015-02-22 3 views
2

У меня возникли проблемы с выяснением того, как передать параметр функции, которая является частью разрешения ngRoute.Передача параметров функции разрешения

В моем случае я делаю вещи с жетонами. Эти маркеры напечатаны, поэтому вы не можете использовать один и тот же токен для подтверждения и отправки по электронной почте и переадресации пароля. Вот как мои маршруты определены:

.when("/confirm/:token", { 
    controller: "confirmEmailController", 
    templateUrl: "/app/views/confirmEmail.html", 
    resolve: { 
     tokenStatus: getTokenStatus 
    } 
}) 
.when("/reset/:token", { 
    controller: "resetPasswordController", 
    templateUrl: "/app/views/resetPasswordEmail.html", 
    resolve: { 
     tokenStatus: getTokenStatus 
    } 
}) 

Вот getTokenStatus функция, которая вызывается для обоих из них:

var getTokenStatus = ["$q", "$route", "tokenService", function($q, $route, tokenService) 
{  
    var deferred = $q.defer(); 

    var tokenType = ???? //<-- how do I pass this? 

    tokenService 
     .getTokenStatus($route.current.params.token, tokenType) 
     .success(function(response) 
     {      
      deferred.resolve(true); 
     }) 
     .error(function() 
     { 
      deferred.resolve(false); 
     }); 

    return deferred.promise; 
}]; 

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

Я занимаюсь этим в течение последних 2 часов, но, похоже, не могу понять.

+1

почему вы не сдадите его в маршрут сам? что было бы проще –

+0

, где вы получаете этот токен? –

+0

@pankajparkar: Это обходной путь, который я использую сейчас, но семантически не лучший способ. – gligoran

ответ

3

1. Вы можете попытаться включить тип маркера в маршрут

.when("/:tokenType/:token", { 
    controller: "confirmEmailController", 
    templateUrl: "/app/views/confirmEmail.html", 
    resolve: { 
     tokenStatus: getTokenStatus 
    } 
}) 
.when("/:tokenType/:token", { 
    controller: "resetPasswordController", 
    templateUrl: "/app/views/resetPasswordEmail.html", 
    resolve: { 
     tokenStatus: getTokenStatus 
    } 
}) 

И то просто получите его от $route.current.params.tokenType. Но это не чистое решение - вы должны проверить свой URL на достоверность.

2. Вы можете использовать функцию упаковки

$routeProvider.when("/confirm/:token", { 
    controller: "confirmEmailController", 
    templateUrl: "/app/views/confirmEmail.html", 
    resolve: { 
     tokenStatus: getTokenStatus("confirm") 
    } 
}) 
.when("/reset/:token", { 
    controller: "resetPasswordController", 
    templateUrl: "/app/views/resetPasswordEmail.html", 
    resolve: { 
     tokenStatus: getTokenStatus("reset") 
    } 
}); 

var getTokenStatus = function(tokenType) { 
    return ["$q", "$route", "tokenService", function($q, $route, tokenService) { 
     var deferred = $q.defer(); 
     tokenService 
      .getTokenStatus($route.current.params.token, tokenType) 
      .success(function(response) 
      {      
       deferred.resolve(true); 
      }) 
      .error(function() 
      { 
       deferred.resolve(false); 
      }); 
     return deferred.promise; 
    }]; 
}; 

3. Вы можете переместить получить лексему-статус логики в отдельный SERVISE

$routeProvider.when("/confirm/:token", { 
    controller: "confirmEmailController", 
    templateUrl: "/app/views/confirmEmail.html", 
    resolve: { 
     tokenStatus: ['tokenStatusGetterService', function(tokenStatusGetterService){ 
      return tokenStatusGetterService("confirm"); 
     }] 
    } 
}) 
.when("/reset/:token", { 
    controller: "resetPasswordController", 
    templateUrl: "/app/views/resetPasswordEmail.html", 
    resolve: { 
     tokenStatus: ['tokenStatusGetterService', function(tokenStatusGetterService){ 
      return tokenStatusGetterService("reset"); 
     }] 
    } 
}); 

//... 

.service('tokenStatusGetterService', ["$q", "$route", "tokenService", function($q, $route, tokenService) { 
    return function(tokenType) { 
     var deferred = $q.defer(); 
     tokenService 
      .getTokenStatus($route.current.params.token, tokenType) 
      .success(function(response) 
      {      
       deferred.resolve(true); 
      }) 
      .error(function() 
      { 
       deferred.resolve(false); 
      }); 
     return deferred.promise; 
    }; 
}]); 
+0

Второе решение - это то, что лучше всего работает в моей ситуации. Благодаря! – gligoran

1

один из способов сделать это, чтобы поместить функцию в ваш сервис getTokenStatus. Это упрощенный пример, но он показывает, как передать аргумент вашей функции разрешения.

app.factory('getTokenStatus',['$q', '$timeout', '$route', function($q, $timeout, $route){ 
    this.action = function(tokenType) { 
    var defer = $q.defer(); 

    $timeout(function(){ 
     var res = { 
     path: $route.current.params.token, 
     tokenType: tokenType 
     } 
     defer.resolve(res); 
    },1000); 

    return defer.promise; 
    } 

    return this; 
}]); 

и вызвать его из объекта постановляю:

app.config(function($routeProvider){ 
    $routeProvider 
    .when("/123/:token", { 
    template: "<h1>hello</h1>", 
    controller: 'testCtrl', 
    resolve: { 
     tokenStatus: function(getTokenStatus) { 
     return getTokenStatus.action('firstToken').then(function(res){ 
      console.log(res); 

     }); 
     } 
    } 
}) 

вот plnkr

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