Я работаю с datatables (datatables.net) в angular 5, и я подписывался на метод для ответа на событие нажатия на tr
, например, так:
const tableRef = this.table; // bound datatable and router to scope
const routerRef = this.router; // so I can use them inside the callBack
this.table.on('click', 'tbody tr', function (e) {
const $tr = $(this).closest('tr');
const data = tableRef.row($tr).data();
if (data !== undefined) {
routerRef.navigateByUrl(`/some/url/details/${data.id}`);
}
});
Это почти идентично образцу на datatables.net
Веб-сайт. Дело в том, что позже я решил изменить свой код, как показано ниже:
this.table.on('click', 'tbody tr', this.rowClicked(this.table, this.router));
//...
private rowClicked(table, router: Router) {
return (e) => {
const $tr = $(this).closest('tr');
const data = table.row($tr).data();
if (data !== undefined) {
router.navigateByUrl('/some/url/details/`${data.id}`');
}
}
}
и ... к моему удивлению, он ничего не сделал, даже не моргнул! Тогда я пошел вперед
и поместите console.log('row clicked');
внутри лямбды (если можно так назвать,
Я действительно новичок в машинописи), и он печатался каждый раз, когда я нажимал на tr
, но data
был всегда undefined
. Я даже изменил table
переменную для $("#my-datatable-id").DataTable()
и до сих пор не повезло. Через несколько минут я решил git diff
файл и понял, что единственный
Разница заключалась в том, как создавался callBack (с использованием ключевого слова function
), поэтому я сделал это и изменил лямбду на:
private rowClicked(table, router: Router) {
return function (e) {
// same as before
}
}
Угадай что, это сработало! Он извлек данные tr
как заклинание. Так что, может кто-нибудь
объясните мне, почему при использовании лямбды я не смог извлечь data
из строки и
при использовании конструкции function
я должен был. Заранее спасибо!