У меня возникли проблемы с получением данных в оверлей. Где я ошибся?
Моя цель - извлечь из пользовательского массива данные (например, cId, зарегистрированные часы) и отобразить их в моей таблице.
<button
[disabled] = "false"
(click) = "op1.show($event)"
pButton
type = "button"
class = "ui-button-primary"
label = "View"
></button>
<p-overlayPanel #op1 [showCloseIcon] = "true" [dismissable] = "false">
<p-table [value] = "day" [style] = "{ width: '400px' }" [rows] = "5">
<ng-template pTemplate = "header">
<tr>
<td class = "headerItem">{{ wbsElement }}</td>
<td class = "headerItem">{{ saturday }}</td>
<td class = "headerItem">{{ sunday }}</td>
...
<td class = "headerItem">{{ total }}</td>
</tr>
</ng-template>
<ng-template pTemplate = "body" let-day>
<tr>
<td>{{ user.cId }}</td>
<td *ngFor = "let day of user.days">{{ day.hoursLogged }}</td>
<td>{{ totalHours }}</td>
</tr>
</ng-template>
</p-table>
</p-overlayPanel>
Выше у меня есть мой шаблон, который должен создать мой оверлей, как показано здесь
wbsElement = Constants.WBS_ELEMENT;
saturday = Day.SATURDAY;
sunday = Day.SUNDAY;
monday = Day.MONDAY;
...
total = Constants.TOTAL;
user: User;
totalHours: number = 0;
constructor(private configService: ConfigService) {}
ngOnInit() {
this.configService.getUsers().subscribe(users => {
this.user = users[0];
});
this.getTotalHours();
}
private getTotalHours() {
this.user.days.forEach(day => (this.totalHours += day.hoursLogged));
}
Это то, что у меня есть в моем файле ts. пользователь принимает фиктивные данные из первого элемента массива пользователей. Вот предварительный просмотр того, что он получает:
{
name: "test",
cId: "akaskdasda",
email: "[email protected]",
platformUser: "akakaksda",
days: [
{ weekday: Day.MONDAY, hoursLogged: 5 },
{ weekday: Day.TUESDAY, hoursLogged: 8 },
...
{ weekday: Day.SUNDAY, hoursLogged: 5 }
]
},
В настоящее время внутри консоли не отображается ошибка, которая помогла бы мне выяснить причину такого поведения, и вывод нежелательно.
Как вы можете видеть внутри ссылки imgur, элементы выходят за пределы таблицы (я не понимаю такого поведения). Я попытался удалить свои двойные привязки из тела таблицы и распечатать случайные данные, чтобы посмотреть, сработает ли это (я также удалил [value]="day" и let-day, когда я это сделал), однако ничего не было показано. Последняя вещь Я пытался заменить ng-template на div (потому что, по сути, это то, чем они являются, насколько я понимаю), но это тоже не помогло.
Вы должны присвоить переменную user
значению таблицы.
Попробуй это.
<p-overlayPanel #op1 [showCloseIcon] = "true" [dismissable] = "false">
<p-table [value] = "user" [style] = "{ width: '400px' }" [rows] = "5">
<ng-template pTemplate = "header">
<tr>
<td class = "headerItem">{{ wbsElement }}</td>
<td class = "headerItem">{{ saturday }}</td>
<td class = "headerItem">{{ sunday }}</td>
...
<td class = "headerItem">{{ total }}</td>
</tr>
</ng-template>
<ng-template pTemplate = "body" let-user>
<tr>
<td>{{ user.cId }}</td>
<td *ngFor = "let day of user.days">{{ day.hoursLogged }}</td>
<td>{{ totalHours }}</td>
</tr>
</ng-template>
</p-table>
</p-overlayPanel>
строка 11 из моего файла шаблона: <p-overlayPanel #op1 [showCloseIcon] = "true" [dismissable] = "false">
Не могли бы вы предоставить stalkbitz или plunker для демонстрации?
Мне удалось решить эту проблему, заменив p-table на table (потому что в противном случае мне пришлось бы переписать способ работы с данными, а я этого не хочу) и возиться с css
Удалось решить эту проблему, отказавшись от p-таблицы и используя вместо нее обычную таблицу. По-видимому, как я нашел здесь, p-table ожидает массив из-за [value]="user".
Я понимаю, что это очень поздно, но вы также можете передать пустой массив значениям, и p-таблица будет работать. Добавлю ответ ниже
Это правильно, что PrimeNg требует [value]
для создания статической таблицы.
Однако вы можете передать пустой массив и сделать все остальное статически по желанию. Итак, если внутри <p-table...
вы добавите [value] = "[[]]"
, вы можете настроить все остальное статически внутри <tr>
s и <td>
s.
Я бы разместил это здесь на случай, если у кого-то еще возникнет аналогичная проблема, прежде чем полностью отказаться от p-table.
Спасибо. Подойдет массив с одним объектом (в комментарии к tearswep вы упомянули пустой массив). Это работает: [value] = "[{}]" Ваш массив в массиве будет работать, так как внутренний массив является объектом. Однако пустой объект кажется более аккуратным.
только что попробовал, и выдает ошибку: OverlayComponent.html:11 ERROR TypeError: this.value.sort не является функцией