Получить доступ к переменной внутри HTML из компонента для Angular 2 Typescript

У меня есть следующий код для отображения модального всплывающего окна из ng-bootstrap. В примере есть кнопка, при нажатии на которую вызывается функция open(content) для отображения представления. Как видите, #content определено в шаблоне HTML. Однако это не совсем то, чего я хочу. Я хочу полностью избавиться от кнопки и вызвать это всплывающее окно программно. Поэтому мне нужно как-то получить ссылку на #content в моем компоненте.

<template #content let-c="close" let-d="dismiss">
  <div class="modal-header">
    <h4 class="modal-title">Modal title</h4>
    <button type="button" class="close" aria-label="Close" (click)="d('Cross click')">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    <p>One fine body&hellip;</p>
  </div>

  <div class="modal-footer">
      <button type="button" class="btn btn-secondary" (click)="c('YES')">YES</button>
      <button type="button" class="btn btn-secondary" (click)="c('NO')">NO</button>
  </div>
</template>

<!--I dont want this button to trigger the template in my actual app. So imagine this code is not here!-->
<button class="btn btn-lg btn-outline-primary" (click)="open(content)">Launch demo modal</button>  

Код open(content) в компоненте:

open(content) {
    this.modalService.open(content).result.then((result) => {
        this.closeResult = `Closed with: ${result}`;
    }, (reason) => {
        this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
    });
}

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

// In this example, content is undefined as I am not and can not pass #content through from the HTML since it is not triggered by a button press like the demo
if (myCustomCondition == true ) {
    this.modalService.open(content).result.then((result) => {
      this.closeResult = `Closed with: ${result}`;
    }, (reason) => {
      this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
    });
}

содержимое не определено


person user172902    schedule 25.01.2017    source источник
comment
Кажется, у меня это работает, не могли бы вы попробовать реплицировать здесь, в эту планку. ?   -  person Pankaj Parkar    schedule 25.01.2017
comment
Эй, Панкадж. Код работает. Но мой вопрос в том, как я могу изменить его, чтобы я мог запускать открытый код из компонента. Причина в том, что у меня нет доступа к содержимому для вызова if (myCondition == true) {open(content)} Как показано в обновленном вопросе   -  person user172902    schedule 25.01.2017
comment
@user172902 user172902, так напиши оператор if? не понимаю в чем дело..   -  person eko    schedule 25.01.2017
comment
Не понял, пожалуйста, уточните это..   -  person Pankaj Parkar    schedule 25.01.2017
comment
Проблема в том, что у меня нет доступа к переменной #content внутри моего компонента. Поэтому я не могу вызвать open(content), если только событие не запускается из HTML-кода, в котором присутствует контент. Я немного обновил вопрос, чтобы объяснить это. Надеюсь, поможет   -  person user172902    schedule 25.01.2017
comment
@user172902 user172902 напишите оператор if внутри метода open(content), который будет обертывать modelService, или напишите его внутри html?   -  person eko    schedule 25.01.2017
comment
Вы пытались использовать @Viewchild?   -  person yurzui    schedule 25.01.2017
comment
Вы хотите передать элемент <template> элементу this.modalService(...)?   -  person Günter Zöchbauer    schedule 25.01.2017
comment
@GünterZöchbauer, это именно то, что я хочу. Ответ, представленный ниже, не будет работать. Я может неправильно сформулировал вопрос. Представьте, что у меня вообще нет нажатия кнопки, чтобы вызвать всплывающее окно. Мне нужен способ вызвать всплывающее окно с помощью кода. полностью обновлю вопрос   -  person user172902    schedule 25.01.2017
comment
В настоящее время Angular2 не позволяет создавать элемент <template>. Он используется только внутри, но никогда не становится настоящим элементом DOM. Что ожидает ваш модальный компонент? Элемент <template> или экземпляр TemplateRef?   -  person Günter Zöchbauer    schedule 25.01.2017
comment
Привет всем, извините за путаницу. Я еще раз обновил весь вопрос, чтобы сделать его более ясным. @GünterZöchbauer, значит ли это, что невозможно добиться того, чего я хотел?   -  person user172902    schedule 25.01.2017


Ответы (1)


Согласно документации TemplateRef можно передать https://ng-bootstrap.github.io/#/components/modal

поэтому это должно работать

  @ViewChild('content') content:TemplateRef;

  open() {
    this.modalService.open(this.content).result.then((result) => {
      this.closeResult = `Closed with: ${result}`;
    }, (reason) => {
      this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
    });
  }
person Günter Zöchbauer    schedule 25.01.2017
comment
Angular явно не нравится синтаксис. Это дает мне следующую ошибку, как только я добавляю @ViewChild('content') contentTemplateRef (и ничего больше). встроенный шаблон: 0: 5, вызванный: formGroup ожидает экземпляр FormGroup. Пожалуйста, передайте один. - person user172902; 25.01.2017
comment
Извините, забыл : - исправлено. - person Günter Zöchbauer; 25.01.2017
comment
Спасибо за помощь @Gunter. Я все еще получаю ту же ошибку, что formGroup ожидает экземпляр FormGroup. Пожалуйста, передайте один. сразу после того, как я добавил @ViewChild('content') content:TemplateRef‹any›. Мне пришлось импортировать TemplateRef и ‹any›, чтобы синтаксис работал. В примере не используется форма, поэтому я не знаю, зачем ему нужна группа форм или что-то в этом роде? - person user172902; 25.01.2017
comment
Извините, я понятия не имею, как formGroup может быть здесь замешан. - person Günter Zöchbauer; 25.01.2017