смотреть значение родительского контроллера из разрешения состояния маршрутизатора пользовательского интерфейса - PullRequest
0 голосов
/ 07 января 2020

В моем приложении AngularJS с использованием ui-router у меня есть три состояния. Родительское состояние в контроллере разрешает обещание и при успешном запросе выполняет код.

В дочернем состоянии portfolio.modal.patent, используя $stateProvider и метод resolve, я делаю другой запрос. Проблема в том, что мне нужно заставить метод resolve ждать, пока обещание не будет возвращено в родительский контроллер portfolio.

Состояния

$stateProvider
.state('portfolio', {
    url: '/portfolio',
    templateUrl: 'app/templates/portfolio/portfolio.tpl.htm',
    controller: 'portfolioCtrl',
    controllerAs: '$ctrl',
})
.state('portfolio.modal', {
    abstract: true,
    views: {
        "modal": {
            templateUrl: "app/templates/patent/modal.html"
        }
    }
})
.state('portfolio.modal.patent', {
    url: '/:patentId',
    resolve: { //NEED TO MAKE THIS RESOLVE AFTER PORTFOLIO CONTROLLER HAS RETURNED ITS PROMISE
        patent: ['$stateParams', 'patentsRestService', function($stateParams, patentsRestService) {
            return patentsRestService.fetchPatentItem($stateParams.patentId);

        }],
    }
}

Контроллер портфеля

function portfolioCtrl() {
    $scope.promise
    .then(function(response) {
          //WHEN PROMISIS RETURNED, THEN RESOLVE DATA IN PORTFOLIO.MODAL.PATENT
    })
}

Вопрос

Как мне разрешить данные дочернего состояния portfolio.modal.patent после того, как обещание было возвращено из родительского состояния контроллер portfolioCtrl

1 Ответ

0 голосов
/ 08 января 2020

Вот быстрый возможный обходной путь, как вы можете попытаться решить вашу проблему, используя службу как мост между запросами

Пример:

// service
const bridge = $q.defer();
const resolveBridgePromise = data => bridge.resolve(data);
const getBridgePromise = () => bridge.promise;

const fetchDataInParentCtrl = () => {
    $timeout(() => {
        console.log('data fetched in parent');

        resolveBridgePromise({ key: 'fetched data' });
    }, 2000);
  };

// controller
fetchDataInParentCtrl();

// resolver
getBridgePromise()
  .then(data => {
      console.log('Do http request here for your child data: ', data);
  });
...