Контроллер состояния UI-Router: Именованный против Встроенной Функции - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить СУХИЕ состояния с UI-Router. У меня есть служба страниц AlchemyPage, которая выбирает страницу через API, используя $http.get

Это прекрасно работает, когда я использую его со встроенным контроллером:

$stateProvider.state('home', {
  url: '/',
  controller: function($stateParams, $scope, AlchemyPage) {
    AlchemyPage.load($stateParams, $scope);
  }
});

$stateProvider.state('organization', {
  url: '/package-organization/:page',
  templateUrl: 'alchemy/page.html',
  controller: function($stateParams, $scope, AlchemyPage) {
    $scope.org = true;
    AlchemyPage.load($stateParams, $scope);
  }
});

Я попытался избавиться от повторений и создал контроллер:

angular.module('App').controller('MainPageCtrl', [
  '$scope',
  '$stateParams',
  'isOrganization',
  'AlchemyPage',
  function($scope,
  $stateParams,
  isOrganization,
  AlchemyPage) {
    $scope.org = isOrganization;
    AlchemyPage.load($stateParams,$scope);
  }
]);

Однако, когда я реализовал, как показано ниже, контроллер не вызывается.

$stateProvider.state('home', {
  url: '/',
  templateUrl: 'alchemy/home.html',
  controller: 'MainPageCtrl',
  resolve: {
    isOrganization: 'false'
  }
});
$stateProvider.state('organization', {
  url: '/package-organization/:page',
  templateUrl: 'alchemy/page.html',
  controller: 'MainPageCtrl',
  resolve: {
    isOrganization: 'true'
  }
});

Использование AngularJS v.1.6.4

Использование UI-Router v.0.4.2

1 Ответ

0 голосов
/ 30 октября 2018

Я решил эту проблему, используя params вместо resolve

Изменено «домашнее» состояние:

$stateProvider.state('home', {
  url: '/',
  templateUrl: 'alchemy/home.html',
  controller: 'MainPageCtrl'
});

Приведенный ниже объект resolve больше не нужен ни в одном из состояний из-за изменения логики в AlchemyPage resource:

resolve: {
    isOrganization: 'false'
  }

Пересмотрено state для организации:

$stateProvider.state('organization', {
  url: '/package-organization/:page',
  templateUrl: 'alchemy/page.html',
  controller: 'MainPageCtrl',
  params: {
    topic: 'organization'
  }
});

Вы можете увидеть выше, что флаг теперь установлен для организации, передав

params: {
  topic: 'organization'
}

Итак, вот очищенный контроллер:

App.controller('MainPagedCtrl', [
  '$stateParams',
  '$scope',
  'AlchemyPage',
  function($stateParams,
  $scope,
  AlchemyPage) {
    AlchemyPage.load($stateParams,
  $scope);
  }
]);

С учетом вышеуказанных исправлений указанный контроллер работает правильно. Resolve работает как положено, я просто неправильно его использовал.

...