Squeak.ru - шаблоны программирования

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

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

родительское государство

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

        'main@': {

          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: {

        'main@': {
          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';
            }
        }

      }

    })

  • попробуйте использовать $scope.$parent после функции тайм-аута 22.10.2014
  • @GeoJacob, куда бы я это поместил. в контроллере дочернего элемента или в области разрешения? 22.10.2014
  • @GeoJacob на самом деле это не работает, родитель - это rootscope, поскольку дочерний элемент переопределяет представление родителя. если бы он был вложен в родительскую область видимости.родитель работал бы 22.10.2014

Ответы:


1

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

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

Основан на

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

Дочерние состояния ДЕЙСТВИТЕЛЬНО наследуют от родительских состояний следующее:

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

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

В связке с

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

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

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

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',

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

23.10.2014
  • да, я видел это как решение где-то. похоже, мне нужно будет создать дополнительное абстрактное состояние для хранения всей моей информации. надеялся, что смогу сделать это без дополнительного абстрактного состояния и просто использовать сервис/фабрику 23.10.2014
  • Service factory... Внедрение в $rootScope также сработает. Но с моей точки зрения это решение... чище. Я бы сказал.. 23.10.2014
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...