Как перевести "это" в D3 JavaScript для TypeScript?
Я знаю, что "this" в JavaScript имеет другое значение, чем в TypeScript, в соответствии с этой статьей "this" в TypeScript. У меня есть следующий код в JavaScript, который используется для создания более толстого штриха на выбранном узле и для всех остальных узлов меньшего штриха.
node.on('click', function (d) {
d3.selectAll('circle').attr('stroke-width', 1.5);
d3.select(this).select('circle').attr('stroke-width', 5);
})
В TypeScript у меня есть
this.node.on('click', (d:any) => {
this.node.selectAll('circle').attr('stroke-width', 1.5);
[this is where I need help].select('circle').attr('stroke-width', 5);
}
3 ответа
Как уже говорилось в этом комментарии и в этом ответе, this
не имеет различного значения между JavaScript и TypeScript.
При этом ваша проблема здесь гораздо прозаичнее: вы пытаетесь использовать this
в функции стрелки, чтобы получить текущий элемент DOM, и это просто не будет работать.
Итак, в двух словах, проблема здесь заключается в разнице this
между функцией стрелки и обычной функцией, а не между TypeScript и JavaScript.
Решение
Есть альтернатива this
, описанный везде в API: когда вы используете анонимную функцию в большинстве методов D3, аргументы передаются...
... текущее значение (d), текущий индекс (i) и текущая группа (узлы), с
this
в качестве текущего элемента DOM (node [i]).
Таким образом, this
это просто текущий индекс (второй аргумент) групп узлов (третий аргумент).
Итак, во фрагменте ниже:
selection.on("foo", function (d, i, n){
console.log(this)
console.log(n[i])
})
Два console.log
вернет то же самое.
Поскольку вы используете функцию со стрелкой, решение (в JavaScript):
this.nodes.on("click", (d, i, n) => {
d3.select(n[i])//rest of your code here
})
Если вы хотите узнать больше об использовании второго и третьего аргументов для получения элемента DOM, взгляните на этот пример: d3 v4 извлекает цель перетаскивания DOM из обратного вызова перетаскивания, когда `this` недоступно
На самом деле это не ответ, я ничего не знаю о D3, так что понизьте, если нужно, но это должно быть указано в очевидном месте для любого, кто читает этот вопрос.
Предпосылка этого вопроса, Как перевести "это" в D3 JavaScript для TypeScript? ложно Я не понизил голос, потому что это важно для обучения.
Я просто хочу уточнить, что this
на 100% идентичны в TypeScript и JavaScript
Фактически, весь синтаксис TypeScript, который также является допустимым синтаксисом JavaScript, имеет точно такую же семантику.
Это то, что делает TypeScript надмножеством JavaScript.
Обновление: я действительно исправлю это с ответом, потому что проблема была в том, что вы думали, что смысл был другим Вы не понимаете синтаксис функции стрелки
(params) => expression or block
Прежде всего =>
это не функция TypeScript, а функция JavaScript.
Во-вторых, TypeScript, как отмечалось выше, естественно поддерживает обе формы. Это означает, что перевод не требуется.
this
означает то же самое в TypeScript, как и в JavaScript.
На обоих языках это означает что-то другое в контексте =>
чем это происходит в контексте function
, Есть много, много ответов, объясняющих это на SO, поэтому я не буду их повторять.
Вот и ответ на этот вопрос.
Если у вас есть этот файл:
d3-app.js
node.on('click', function (d) {
d3.selectAll('circle').attr('stroke-width', 1.5);
d3.select(this).select('circle').attr('stroke-width', 5);
});
Это работает, и вы хотите переписать его в TypeScript.
Вот что ты делаешь:
- переименуйте d3-app.js в d3-app.ts
Это все.
Ответ состоял в том, чтобы заменить "это" на "d3.event.currentTarget"
d3.select(d3.event.currentTarget).select('circle').attr('stroke-width', 5);