Как наследовать данные разрешения в u-router

У меня здесь сложная ситуация. мое родительское состояние и дочернее состояние оба переопределяют один и тот же вид на верхнем уровне (index.html). Поэтому, когда он переходит в дочернее состояние от родителя, область становится поврежденной (я думаю?) В принципе у родителя есть решение, которое хранится в свойстве MetricData, которое я не могу получить от ребенка, так как его не вложен я если предположить. Есть ли способ получить это свойство metricdata в дочернем элементе без необходимости вручную повторять один и тот же вызов ajax в дочернем

родительское состояние

     .state("home.metric", {
      url: "/category/:categoryId/metric/:metricId/name/:metricName",
      views: {

        '[email protected]': {

          templateUrl:
            function (stateParams){
              //move this to a util function later
              var tempName = unescape(stateParams.metricName);
              tempName = tempName.replace(/\s/g, "-");

              return '../partials/slides/' + tempName + '.html';
            },
          resolve: {
            MetricData: ['MetricService', '$stateParams', 
              function(MetricService,    $stateParams){
                var data = { categoryId : $stateParams.categoryId, metricId : $stateParams.metricId};
                return MetricService.getMetricDetails(data);
              }]
          },
          controllerProvider: 
            function ($stateParams) {
              var tempName = unescape($stateParams.metricName);
              tempName = tempName.replace(/\s+/g, '');

              return tempName + 'Ctrl';
            }
        }
      }

    })

дочернее состояние

.state("home.metric.detail", {
      url: "/detailId/:detailId/detailName/:detailName",
      views: {

        '[email protected]': {
          templateUrl:
            function ($stateParams){
              //move this to a util function later
              var tempName = unescape($stateParams.detailName);
              tempName = tempName.replace(/\s/g, "-");

              return '../partials/slides/' + tempName + '.html';
            },
          resolve: {
            DetailData: ['DetailService', '$stateParams',
              function(DetailService,      $stateParams){
                var data = { categoryId : $stateParams.categoryId, detailId : $stateParams.detailId};
                return DetailService.getDetails(data);
              }],
            // MetricData: ['MetricService', '$stateParams', 
            //   function(MetricService,    $stateParams){
            //     var data = { categoryId : $stateParams.categoryId, metricId : $stateParams.metricId};
            //     return MetricService.getMetricDetails(data);
            //   }]
          },
          controllerProvider: 
            function ($stateParams) {
              var tempName = unescape($stateParams.detailName);
              tempName = tempName.replace(/\s+/g, '');

              return tempName + 'Ctrl';
            }
        }

      }

    })

Ответ 1

I. Ответ на вопрос:

... дочерний с не вложенным... Есть ли способ получить это свойство metricdata в дочернем?

Основан на

Что наследуют дочерние государства из родительских состояний?

Дочерние состояния DO наследуют следующее из родительских состояний:

  • Разрешенные зависимости через разрешение
  • Пользовательские свойства данных

Ничего больше не наследуется (без контроллеров, шаблонов, URL-адресов и т.д.).

в сочетании с

Наследование наследования по только иерархии просмотров

Имейте в виду, что свойства области только наследуют цепочку состояний, если представления ваших состояний вложены. Наследование свойств области не имеет ничего общего с вложением ваших состояний и всем, что связано с вложенность ваших представлений (шаблонов).

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

II. Пока это должно быть ясно, мы все еще должны найти способ решения:

... Есть ли способ, чтобы получить это свойство metricdata в дочернем без необходимости вручную повторять вызов ajax еще раз в дочернем элементе.

И я бы сказал, есть и ответ. Например.

.. переместите общие представления/преобразователи в наименьший общий знаменатель...

например. мы можем сделать это как в этом Q и A: Управление порядком операций с сервисами и контроллерами, см. plunker:

Особое положение родителя/корня:

$stateProvider
  .state('root', {
    abstract : true,
    // see controller def below
    controller : 'RootCtrl',
    // this is template, discussed below - very important
    template: '<div ui-view></div>',
    // resolve used only once, but for available for all child states
    resolve: {
      user: function (authService) {
          return authService.getUserDetails();
      }
    }
  }) 

Передача разрешенных материалов в область $scope (унаследованная каждым дочерним элементом)

.controller('RootCtrl', function($scope,user){
  $scope.user = user;
})

Это вводится поверх нашей иерархии состояния/представления, и любое дочернее состояние будет получать от нее прибыль

// any previously root state will just use the above as a parent
.state('index', {
    url: '/',
    parent : 'root',

Проверьте здесь и просмотрите его в рабочий пример