Как перерисовать компонент вручную?

Я новичок в Angular2, я привык к циклу цикла Angular 1, то есть, если я обновляю область видимости, я могу вручную вызвать дайджест, вызвав $scope.$digest(). Тем не менее, я не уверен, как это сделать в Angular2, esp, учитывая, что новая структура не имеет неявных привязок данных, которые использовалась в старой версии.

Вот моя проблема. У меня есть маршрут, который загружает компонент при попадании URL-адреса с параметром:

// Router
export const AppRoutes : RouterConfig = [
    {
    path: 'my/:arg/view',
    component: MyComponent  
    }
]

Тогда у меня есть этот компонент:

// Component
export class MyComponent {
    constructor(private route : ActivatedRoute,
      private r : Router) {
    let id = parseInt(this.route.params['value'].id);
    console.log(id);
    // do stuff with id
    }

    reloadWithNewId(id:number) {
        this.r.navigateByUrl('my/' + id + '/view');
    }
}

Предположим, что я перехожу к url ​​ /my/1/view. Он вызывается конструктором и записывается номер 1. Однако, если я вызываю reloadWithNewId с новым id, reloadWithNewIf(2), конструктор не вызывается снова. Как вручную перезагрузить компонент?

Ответы

Ответ 1

Не нужно перезагружать компонент. Просто обновите модель и сами обновления:

export class MyComponent {
    constructor(private route : ActivatedRoute,
      private r : Router) {}

    reloadWithNewId(id:number) {
        this.r.navigateByUrl('my/' + id + '/view');
    }

    ngOnInit() {
      this.sub = this.route.params.subscribe(params => {
         this.paramsChanged(params['id']);
       });
    }

    paramsChanged(id) {
      console.log(id);
      // do stuff with id

    }
}

Ответ 2

Вы можете заставить angular2 повторно инициализировать компонент, перейдя по другому URL-адресу, а затем обратно к тому, который вы хотите.

Вот мое проворное обходное решение с использованием методов класса Router (ссылка: https://angular.io/docs/ts/latest/api/router/index/Router-class.html)

Конструктор компонентов:

constructor(private router: Router) {}

В шаблоне (пример):

(click)="onTabChange(id)"

Затем внутри класса компонента:

onTabChange() {
  if (this.router.navigated === false) {
    // Case when route was not used yet
    this.router.navigateByUrl(`/module/${id}`);
  } else {
    // Case when route was used once or more
    this.router.navigateByUrl(`/index`).then(
      () => {
        this.router.navigateByUrl(`/module/${id}`);
      });
  }
}

Ответ 3

Конструктор не будет вызываться снова, когда вы просто обновляете параметры. Поскольку класс Component уже создан,

вы можете подписаться на изменения параметров, как показано ниже, если вы хотите обнаружить изменение,

  constructor(route: ActivatedRoute) {
    route.params.subscribe(param => {
        let id = param['id '];
        // Do your stuff with id change.
    });
  }

Надеюсь, это поможет!