Получение текущего имени / адреса маршрута с помощью AngularDart5 - PullRequest
0 голосов
/ 16 января 2020

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

@Component(
    selector: "blah", 
    template: """blah""", 
    directives: const [routerDirectives])
class Blah extends Object with Reuse implements OnActivate {

    @override
    void onActivate(RouterState previous, RouterState current) {
        window.alert("Activated");
        print("activated");
    }

} 

перезагрузить страницу или использовать маршрутизатор для переключения маршрутов, и onActivate не запускает

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

  void navigate(RouteDefinition route) {
    final NavigationParams params =
        new NavigationParams(queryParameters: {"project-id": "1", "workspace-id": "2"}, replace: true);

    router.navigate(route.path, params);
  }

Что мне здесь не хватает?

Это мой файл pubspe c .yaml:

name: blah
version: 0.0.0
description: Blah

environment:
  sdk: ">=2.0.0 <3.0.0"

dependencies:
  angular: ^5.3.1
  angular_forms: ^2.1.2
  angular_router: ^2.0.0-alpha+22
  event_bus: any
  http: any
  js: ^0.6.0
  logging: ^0.11.3+1
  html: any
  html_unescape: ^1.0.1+2
  google_maps: ^3.4.1

  someothercomponent:
    path: ../someothercomponent

dev_dependencies:
  angular_test: 2.3.0
  build_runner: ^1.5.2
  build_test: ^0.10.2
  build_web_compilers: ^2.0.0
  test: ^1.0.0

EDIT : я не знаю, связано ли это каким-либо образом, когда я внедряю маршрутизатор через конструктор

  final Router router;

  ProjectLayout(this.router) {

    log.fine(this.router.current.toUrl());

  }

this.router.current равен нулю

При добавлении this.route,

  final RouterState route;
  final Router router;


  ProjectLayout(this.router, this.route) {

    log.fine(route.toUrl());

  }

он жалуется No provider found for RouterState, добавляя RouterState в качестве поставщика, ошибка превращается во что-то очень странное:

dart_sdk.js:99585 EXCEPTION: No provider found for String: RouterState -> String.
**NOTE**: This path is not exhaustive, and nodes may be missing in between the "->" delimiters. There is ongoing work to improve this error message and include all the nodes where possible. 
STACKTRACE: 
dart:sdk_internal                                                          throw_
package:angular/src/di/injector/injector.dart 20:3                         throwsNotFound
package:angular/src/di/injector/injector.dart 92:14                        get
package:angular/src/core/linker/app_view.dart 313:28                       injectorGet
package:angular/src/di/injector/element.dart 23:16                         [_injectFrom]
package:angular/src/di/injector/element.dart 31:7        

Так что было бы неплохо, чтобы это работало с помощью OnActivate, так же, как было бы хорошо, чтобы оно работало через инъекцию маршрутизатора

1 Ответ

0 голосов
/ 17 января 2020

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

Просмотр * 1004 Исходный код *, я заметил этот комментарий:

/// Note this isn't updated until after all `onActivate` implementations are
  /// invoked, and [onRouteActivated] fires.
  RouterState get current;

Это означает, что router.current становится ненулевым только в тех компонентах, где работает OnActivate и только после запуска onActivate.

...