Доступ к переменной шаблона внутри компонента

У меня возникла проблема с ng-template.

Мы передаем некоторые параметры через ngTemplateOutletContext, как показано ниже, в компоненте таблицы. Мы используем разные средства визуализации для ячеек в зависимости от типа данных, содержащихся внутри. Обратите внимание на параметр cellvalue, поскольку это то, что мне нужно.

<ng-container *ngIf = "useCellRenderer(column, row)">
   <ng-template [ngTemplateOutlet] = "column.renderer.templateref" [ngTemplateOutletContext] = "{ cellvalue: row[column.attr], rowvalue:row }">
   </ng-template>
</ng-container>

Шаблон компонента, отвечающего за рендеринг, выглядит следующим образом:

<ng-template #templateRef let-cellvalue = "cellvalue" let-rowvalue = "rowvalue">
  {{ getTraslateValue(cellvalue)}}
</ng-template>

Шаблон может получить доступ к параметру cellvalue и правильно вызвать функцию, но я хочу получить доступ к тому же параметру из TS компонента и, похоже, не могу это сделать.

То, что я пробовал до сих пор, соответствует следующему фрагменту

@ViewChild('templateRef', { read: TemplateRef })
  public templateref: TemplateRef<any>;

  ngAfterViewInit() {
    console.info('ngAfterViewInit', this.templateref.elementRef);
  }

Но в console.info нигде нет значения ячейки.

Заранее спасибо!

любые ошибки в консоли

Sachila Ranawaka 03.07.2018 13:32

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

Ivan 03.07.2018 14:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
2
1 561
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, это не ответ, а просто предложение, поэтому, пожалуйста, не игнорируйте его, если это не сработает.

Вы пробовали что-то подобное?

html

<ng-template #cellValue = "cellvalue" let-cellvalue = "cellvalue" let-rowvalue = "rowvalue">
  {{ getTraslateValue(cellvalue)}}
</ng-template>

ts

@ViewChild('cellValue') public cellValue: any;

Я не уверен, что это сработает, потому что такие конструкции, как #cellValue = "cellvalue", работают только с директивами, которые имеют описание exportAs в своих декораторах.

Это не сработает:

@ViewChild('templateRef', { read: TemplateRef })
  public templateref: TemplateRef<any>;

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

Я пойду и попробую это.

Ivan 03.07.2018 14:02

Как вы сказали, ваше первое решение не сработает, потому что это не директива exporAs. Я пробовал получить такой доступ и возвращает undefined: HTML <ng-template #templateRef let-cellvalue = "cellvalue" let-rowvalue = "rowvalue"> <div #test>test</div> {{ getTraslateValue(cellvalue)}} </ng-template> TS @ViewChild('test', { read: TemplateRef }) public cellValue: any; ngAfterViewInit() { console.info(this.cellValue); } Извините за форматирование кода: S

Ivan 03.07.2018 14:42

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

SebOlens 03.07.2018 14:44

также не считывайте TemplateRef объекта, который не является шаблоном, прочтите ViewContainerRef или ElementRef.

SebOlens 03.07.2018 14:46

Далее я попробую использовать директивный подход и расскажу, как все прошло. Спасибо за помощь, Себ!

Ivan 03.07.2018 14:52
Ответ принят как подходящий

Итак, @SebOlens привел меня к решению тем, что он сказал. Я закончил создание директивы с помощью exportAs. Директива выглядит следующим образом:

TS

@Directive({ selector: '[exposeVariable]', exportAs: 'exposed' })
export class ExposeVariableDirective {
  @Input() variablesToExpose: any;
  }
}

Его можно использовать в шаблоне, например, следующим образом:

HTML

<ng-template #templateRef let-cellvalue = "cellvalue" let-rowvalue = "rowvalue">
  <div exposeVariable [variablesToExpose] = "{cellValue: cellvalue}" #exposedRef = "exposed">
    {{ getTraslateValue(cellvalue)}}
  </div>
</ng-template>

И значение ячейки можно получить из компонента:

TS

@ViewChild('exposedRef') public directiveExposed: any;

В моем случае директива начинается после AfterViewInit компонента, поэтому, если вы попытаетесь инициализировать что-то, вам придется либо посмотреть значение переменной ViewChild, либо, в моем случае, я активировал компонент с помощью ngIf и открытой переменной. из шаблона, чтобы я мог использовать хуки из нового компонента.

Еще раз спасибо @SebOlens :)

Рад, что получилось :) Не забудьте проголосовать за ответ

SebOlens 05.07.2018 14:57

Готово, извини забыл :)

Ivan 06.07.2018 10:09

Другие вопросы по теме