Как получить "этот" объект в Fay?
Учитывая этот HTML:
<div class="blah" id="div1">a</div>
<div class="blah" id="div2">b</div>
Я пытаюсь сделать так, чтобы обработчик зависел от значения "this", как в следующем коде JavaScript:
$(document).ready(function() {
$(".blah").click(function() {
alert(this.id); }); });
Как это сделать в Fay? Я не нашел API для этого. Похоже, невозможно вызвать ffi напрямую из main:
main = ready $ do
select ".blah" >>= onClick (\_ ->
ffi "alert(this.id)")
Я получаю "Тест $ffi не определен". Мне удалось вызвать FFI, используя код ниже:
alertthis = ffi "alert(this.id)"
main = ready $ do
select ".blah" >>= onClick (\_ ->
alertthis)
Но теперь "this" относится к некоторому объекту, специфичному для Fay, и не имеет свойства "id".
1 ответ
Прежде всего, у вас нет сигнатуры типа для ваших вызовов ffi, либо сделайте объявление верхнего уровня (я думал, что fay выдаст ошибку по этому поводу, но, возможно, этого не произойдет, следует это исправить):
alert :: sometype -> Fay ()
alert = ffi "alert(%1)"
или используйте его на уровне выражения:
(\_ -> (ffi "alert(%1)" :: sometype -> Fay ()) myThis))
this
недоступен в функции Fay, потому что он не имеет того же представления, что и функция js, некоторые преобразования происходят так this
теряется в процессе.
Мы решили, что не стоит зависеть от this
быть связанным в любом случае. Вы не дали определение для вашего onClick
функция, но, вероятно, аргумент, который вы игнорируете в обратном вызове, содержит объект события, который имеет target
имущество. Это не всегда работает из-за распространения событий, если это проблема, которую вы можете передать this
к тому же, что-то вроде
onClick :: (Element -> Event -> Fay ()) -> JQuery -> Fay JQuery
onClick = ffi "%2.click(function (e) { %1(this, e); })"