Дочернее состояние ui-router не загружается внутри компонента Angular с пониженной версией

У меня есть приложение Angular / AngularJS с гибридной / ленивой загрузкой, которое использует как новый маршрутизатор Angular, так и ui-router версии 0.4.2 с параллельными выходами / представлениями. Для этого я следил за Виктором Савкиным Lazy Loaded AngularJS guide В целом это работает хорошо, и я могу переключаться между маршрутами Angular и маршрутами AngularJS. Однако я сталкиваюсь с проблемой, когда дочерние представления ui-router не отображаются при первом открытии страницы.

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

Определения состояний и шаблонов

@Component({ template: '<ng-content></ng-content>'})
export class TestDowngradedComponent { }

angular.module('routerPatchModule', ['ui.router'])
.directive('downgradedComp', downgradeComponent({ component: TestDowngradedComponent }))
.config(['$stateProvider', ($stateProvider) => {
  $stateProvider.state({
    name: 'parent',
    url: '/parent',
    template: '<downgraded-comp><ui-view></ui-view></downgraded-comp>',
  })
  .state({
    name: 'parent.test',
    url: '/test',
    template: 'The child route doesn't appear on load',
  })
}]);

/**
 * Ng2 Module which upgrades the legacy Ng1 module
 */
@NgModule({
  declarations: [
    EmptyTemplateComponent,
    TestDowngradedComponent,
  ],
  entryComponents: [
    TestDowngradedComponent,
  ],
  imports: [
    SharedModule,
    UpgradeModule,
    RouterModule.forChild([
      {path: '**', component: EmptyTemplateComponent},
    ]),
  ],
})
export class LegacyAppModule {
  constructor(upgrade: UpgradeModule) {
    upgrade.bootstrap(document.body, [ng1AppModule, 'routerPatchModule'], { strictDi: true });
    setUpLocationSync(upgrade);
  }
}

Отслеживая события изменения состояния, я смог определить, что дочернее представление временно загружается, но затем удаляется.

Журнал событий состояния

$viewContent Loading undefined {"view":"@"}
$viewContent Loaded  undefined {"view":"@"}

$stateChange Start   state1.child
$stateChange Success state1.child
$viewContent Loading undefined {"view":"@"}
$viewContent Loading state1 {"view":"@state1"}
$viewContent Loaded  state1.child {"view":"@state1"} // child view temporarily loaded
$viewContent Loaded  state1 {"view":"@"} // child view gone!

// User clicks link to state2
$stateChange Start   state2
$stateChange Success state2
$viewContent Loading undefined {"view":"@"}
$viewContent Loading state2 {"view":"@state2"}
$viewContent Loaded  state2 {"view":"@state2"}
$viewContent Loaded  state2 {"view":"@"}
$stateChange Start   state2.child
$stateChange Success state2.child
$viewContent Loading state2 {"view":"@state2"}
$viewContent Loaded  state2.child {"view":"@state2"} // Child loaded successfully

// User clicks link to state1
$stateChange Start   state1
$stateChange Success state1
$viewContent Loading undefined {"view":"@"}
$viewContent Loading state1 {"view":"@state1"}
$viewContent Loaded  state1 {"view":"@state1"}
$viewContent Loaded  state1 {"view":"@"}
$stateChange Start   state1.child
$stateChange Success state1.child
$viewContent Loading state1 {"view":"@state1"}
$viewContent Loaded  state1.child {"view":"@state1"} // Child loaded after parent

А как насчет использования компонента с <ng-content>, из-за которого пользовательский интерфейс не отображается правильно, и что я могу сделать, чтобы исправить эту проблему?


person Chic    schedule 01.09.2017    source источник


Ответы (1)


При использовании директивы ui-view внутри компонента с пониженной версией заключите директиву ui-view в div.

  $stateProvider.state({
    name: 'parent',
    url: '/parent',
    template: '<downgraded-comp><div><ui-view></ui-view></div></downgraded-comp>',
  })

Я случайно наткнулся на решение и не совсем уверен, почему оно сработало. Интересно, не является ли это результатом замены элементов dom библиотекой @angular/upgrade.

person Chic    schedule 05.09.2017
comment
Тоже столкнулся с этой проблемой. Это загадочно. Я могу правильно перейти к своему состоянию, URL-адрес обновляется, как ожидалось, но, что бы я ни пытался, не могу отобразить шаблон. Ни даже строки шаблона. Предлагаемое решение не работает. - person pccjamie; 13.03.2018
comment
Наступил 2020 год, и в настоящее время я работаю над гибридным приложением Angular / Angular.js, использующим компоненты Angular с более ранней версией. Похоже, вы столкнулись с проблемой, описанной в OP, и предлагаемое решение здесь не работает. Кажется, я не могу настроить таргетинг на какой-либо ui-view, который отображается из шаблона компонента Angular с пониженной версией. Есть какие-нибудь недавние идеи? - person Princeton Collins; 24.04.2020