Почему я получаю «неопределенную» ошибку в отношении данных в моем угловом шаблоне?

#angular #templates #components #kendo-grid

Вопрос:

Я пытаюсь создать шаблон в своем приложении Angular 11, но он не распознает данные внутри него.

У нас есть сетка кендо, и мы хотим, чтобы первый столбец состоял из кнопки, которая при нажатии вызывает меню. Поэтому я создал компонент, который будет функционировать как кнопка и меню:

введите описание изображения здесь

Как вы можете видеть, у нас есть 3 пункта в меню. Но на нашем сайте есть некоторые сетки, для которых требуется больше, чем просто эти 3 элемента. Для них требуются элементы, уникальные для сетки. Вместо того, чтобы указывать в меню все возможные элементы, которые могут понадобиться сетке (и скрывать их, если они не нужны), я пытаюсь добавить их в качестве шаблона в меню из компонента, в котором размещена сетка.

Вот как я это делаю:

 <kendo-grid [data]="data" ... >
  <kendo-grid-column ... >
    <ng-template kendoGridCellTemplate let-dataItem>

      <!-- MY TEMPLATE -->
      <ng-template #customMenuItemsTemplate let-dataItem="dataItem">
        <button mat-menu-item *ngIf="dataItem.hpi?.id" ... >
          <mat-icon>...</mat-icon>
        </button>
      </ng-template>
    
      <!-- MY BUTTON amp; MENU COMPONENT -->
      <app-command-menu
        [contentTemplate]="customMenuItemsTemplate"
        [hpiId]="dataItem.hpi.id"
        ...
      ></app-command-menu>
      
    </ng-template>
  </kendo-grid-column>
</kendo-grid>
 

Как вы можете видеть, я определяю свой шаблон внутри сетки (точнее, внутри таблички kendoGridCellTemplate). Я определяю его непосредственно перед компонентом командного меню приложения. Я даю шаблону ссылочный тег #customMenuItemsTemplate и использую эту ссылку для привязки шаблона к [ContentTemplate] в компоненте командного меню. Я добавляю шаблон внутри сетки, чтобы он знал, что такое элемент данных. Тем не менее, я продолжаю получать сообщение об ошибке в консоли, говорящее::

Cannot read properties of undefined (reading 'hpi')

До того, как я добавил шаблон, у приложения не было проблем с DataItem. Как вы можете видеть, я привязываюсь dataItem.hpi.id к [hpiId] компоненту командного меню. Это было там до того, как я добавил шаблон, и он работал нормально. Почему элемент данных должен быть определен для компонента, но не для шаблона, даже если они оба находятся в одном и том же месте в сетке? Связано ли это с тем, что значения в шаблоне считываются только изнутри компонента (т. Е. После их ввода), а не со страницы с сеткой?

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

Ответ №1:

Решение этой проблемы было очень простым. Мне пришлось удалить let-dataItem="dataItem" его из своего шаблона. Так что это:

 <ng-template #customMenuItemsTemplate let-dataItem="dataItem">
...
</ng-template>
 

превратился в это:

 <ng-template #customMenuItemsTemplate>
...
</ng-template>
 

Я не совсем понимаю, почему это сработало. Я бы подумал, что установка элемента данных с let-dataItem="dataItem" помощью будет в лучшем случае безвредной, но, по-видимому, это приводит к тому, что Angular НЕ знает, что такое элемент данных.