Fay JQuery работает с массивом элементов

Каков предпочтительный способ, как рассчитать количество элементов, выбранных селектором?

Один из способов, которым я могу придумать, - это вызвать JQuery size:

size :: JQuery -> Fay Int
size = ffi "%1['size']()"

Другой способ - получить список из вызова функции, а затем сосчитать элементы. Тип функции, которая извлекает элементы, вероятно, будет следующим:

elems :: JQuery -> Fay [Elem]

Кто-нибудь знает, как это реализовать? Как можно описать соответствие между типами javascript и типами haskell?

1 ответ

Решение

Есть два способа обработки объектов JavaScript в Fay.

Непрозрачные типы данных

Используя EmptyDataDecls:

{-# LANGUAGE EmptyDataDecls #-}
[...]
data JQuery

Это то, что делает fay-jquery, это позволяет пользователям библиотеки легко определять новые привязки FFI, так что ваш пример размера работает. Но обратите внимание, что в jQuery это устарело, поэтому лучше использовать length как предполагает Джон Б.

Всякий раз, когда fay сталкивается с чем-то, что должно быть типа JQuery, оно не трогает его, поэтому у вас будет прямая ссылка на объект javascript.

документация

Другой подход состоит в том, чтобы отобразить объект javascript на запись, это более хороший вариант, если рассматриваемый объект отображается легко, например, при обработке JSON или при взаимодействии клиент-сервер.

data User = User { name :: String }

userA :: User
userA = ffi "{ instance : \"User\", name : \"Adam\" }"

userB :: User
userB = User { name = "Adam" }

Это идентичные способы построения пользовательской записи, но userA, конечно, немного надуманный, возможно, значение будет получено со стороны сервера или из некоторой библиотеки JS в этом случае (в противном случае вообще нет причин использовать FFI)

В этом случае вы не будете хранить ссылку на объект JS, будет создана неизменная запись пользователя.

Я также думаю, что вы можете пропустить Fay в типе возврата. Я думаю, можно с уверенностью предположить, что объекты jQuery не будут видоизменяться, особенно если они создаются из Fay.

length :: JQuery -> Int
length = ffi "%1['length']"

Также см. Вики-страницу FFI.

Редактировать: Слегка связанный, fay-uri - это хорошо документированный и довольно простой пример того, как построить неизменный слой FFI поверх изменяемой библиотеки js.

Другие вопросы по тегам