Подтвердить что ты не робот

Ui-router: маршрут без шаблона просмотра

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

Да, я прочитал: https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-open-a-dialogmodal-at-a-certain-state, но это не совсем то, что я ищу.

Например, допустим, что у меня есть основное тело с представлением:

<body ui-view></body>

И какая-то базовая конфигурация:

// Routes
$stateProvider
  .state('myaction', {
    url: "/go/myaction",
    onEnter: function() {
      console.log('doing something');
    }
  });

При посещении /go/myaction вид пуст. Можно ли это сделать?

4b9b3361

Ответ 1

Мне удалось решить эту проблему, перенаправив состояние безголовы, в которое я принимал программные действия, в состояние WITH с представлением в конце состояния без головы:

$stateProvider
  .state('myaction', {
    url: "/go/myaction",
    onEnter: function() {
      console.log('doing something');
    }
    controller: function($state) {
      $state.go('home');
    }
  });

Ответ 2

У вас нет контроллера без вида, но вы можете использовать onEnter вместо контроллера. Если вы не хотите изменять текущий вид при доступе к этому состоянию, вы можете определить его как дочернее состояние:

$stateProvider

   // the parent state with a template
   .state('home', {
      url: '/home',
      templateUrl: '/home.html',
      controller: 'HomeCtrl'
   })

   // child of the 'home' state with no view
   .state('home.action', {
      url: '/action',
      onEnter: function() {
         alert('Hi');
      },
   });

Теперь в home.html вы можете сделать что-то вроде этого:

<a href ui-sref=".action">Greet me!</a>

Ответ 3

Из документов:

Предупреждение. Контроллер не будет создан, если шаблон не определен.

Почему вы не используете пустую строку в качестве шаблона для преодоления этого?

Ответ 4

Да, вы можете это сделать. Используйте абсолютные имена просмотров, чтобы повторно использовать <ui-view> другого состояния.

Взгляните на этот пример:

Пользователи идут в мое приложение, но в зависимости от того, что они прошли проверку подлинности или нет, я хочу отправить их на общедоступную или закрытую страницу. Я использую только состояние index, чтобы проверить, вошли ли они в систему или нет, а затем перенаправить их на index.private или index.public.

В дочерних состояниях используется абсолютное имя вида, чтобы использовать элемент <ui-view>, соответствующий состоянию index. Таким образом, мне не нужно делать второй вложенный <ui-view>.

$stateProvider.state('index', {
  url: "/",
  controller: 'IndexCtrl'
}).state('index.private', {
  views: {
    "@": {
      templateUrl: 'private.html',
      controller: 'PrivateCtrl'
    }
  }
}).state('index.public', {
  views: {
    "@": {
      templateUrl: 'public.html',
      controller: 'PublicCtrl'
    }
  }
});

Небольшое примечание в этом примере: здесь я использую ярлык @. Обычно вы используете [email protected].