Как получить "этот" объект в 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); })"
Другие вопросы по тегам