2016-05-02 2 views
3

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

Вот мой маршрут:

.when('/filters/edit/:id', { 
    name: 'filters-edit', 
    templateUrl: './assets/angular/modules/filters/filters-edit.html', 
    controller: 'FiltersSingleCtrl', 
    controllerAs: 'fs', 
    resolve: { 
     routeData: ['$q', '$route', '$location', 'utils', 'filtersApi', 'samplesApi', 'tagsApi', 'simpleCsdlData', function($q, $route, $location, utils, filtersApi, samplesApi, tagsApi, simpleCsdlData) { 

      var ID = $route.current.params.id; 

      var startTime = utils.getPreviousDate(30, 'yyyy-MM-dd').dateFrom + ' 00:00', 
        stopTime = utils.formatDate(utils.getDateNow(), 'yyyy-MM-dd') + ' 00:00'; 

      return $q.all({ 
       filter: filtersApi.single({id: ID}).then(function(res) { 

        res.data.versionResults[0].isAdvanced = true; 

        if (res.data.versionResults[0].isAdvanced) { 

         $location.path('/filters/edit/' + res.data.id + '/advanced'); 

         $q.reject(); 
        } 

        simpleCsdlData.set(res.data.versionResults[0].simpleFilterParts); 
       }), 
       countries: filtersApi.countries() 
      }); 
     }] 
    } 
}) 

Так что, когда res.data.versionResults[0].isAdvanced правда мне нужно отказаться от обещанного, так что вид не загружается вообще, теперь загружает и затем перенаправляет пользователя на другую страницу, которая не то, что я хочу.

Как я могу отказаться от обещания вручную?

ответ

2

Похоже, вы пытаетесь отклонить обещание filter в пределах пути успеха (обратный вызов .then). Чтобы сделать это, вы можете преобразовать исходное обещание в другом, который будет отвергнут в интересующем событии (который, возможно, потребуется некоторая полировка, как видно из моего комментария ниже в коде):

routeData: ['$q', '$route', '$location', 'utils', 'filtersApi', 'samplesApi', 'tagsApi', 'simpleCsdlData', function($q, $route, $location, utils, filtersApi, samplesApi, tagsApi, simpleCsdlData) { 
    var transformPromise = function(id) { 
     var deferred = $q.defer(); 

     filtersApi.single({id: id}).then(function(res) { 
      res.data.versionResults[0].isAdvanced = true; 
      // TODO: You probably want to rethink this boolean logic here 
      // Setting a variable to true and checking whether it is true 
      // immediately afterwards hardly makes much sense 
      if (res.data.versionResults[0].isAdvanced) { 
       $location.path('/filters/edit/' + res.data.id + '/advanced'); 
       deferred.reject(); 
      } else { 
       simpleCsdlData.set(res.data.versionResults[0].simpleFilterParts); 
       deferred.resolve(res.data.versionResults[0].simpleFilterParts); 
      } 
     }).catch(deferred.reject); 

     return deferred.promise; 
    }; 

    var ID = $route.current.params.id; 

    // TODO: not quite sure the point of those 2 variables 
    var startTime = utils.getPreviousDate(30, 'yyyy-MM-dd').dateFrom + ' 00:00', 
     stopTime = utils.formatDate(utils.getDateNow(), 'yyyy-MM-dd') + ' 00:00'; 

    return $q.all({ 
     filter: transformPromise(ID), 
     countries: filtersApi.countries() 
    } 
}]; 
+0

Отнесения только тест заявление : P забыл удалить его ха-ха. – Chrillewoodz

+0

Извините, я пропустил часть решения. Большой ответ спасибо :) – Chrillewoodz

0

У меня есть два предложения:

  1. Есть "RedirectController" без шаблона, но ваш filtersApi вызов. Внутри .then() вы можете решить, куда перенаправить следующее. Поэтому вместо перехода на filters-edit запретите его внутри $rootScope.on('$stateChangeStart') и сначала перейдите в «перенаправление».
  2. Поместите вызов filtersApi внутри контроллера вместо маршрута. По моему опыту, когда у вас есть перенаправление в верхней части контроллера , ничего не будет показано, и пользователь сразу перенаправляется .

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

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