Fay JQuery使用元素数组

cou*_*ech 3 jquery fay

什么是首选方法,如何计算选择器选择的元素数量?

我能想到的一种方法是调用JQuery size:

size :: JQuery -> Fay Int
size = ffi "%1['size']()"
Run Code Online (Sandbox Code Playgroud)

另一种方法是从函数调用中获取列表,然后计算元素.检索元素的函数类型可能是:

elems :: JQuery -> Fay [Elem]
Run Code Online (Sandbox Code Playgroud)

有谁知道,如何实现它?如何描述javascript类型和haskell类型之间的映射?

Ada*_*ark 5

在Fay中有两种处理javascript对象的方法.

不透明的数据类型

使用EmptyDataDecls:

{-# LANGUAGE EmptyDataDecls #-}
[...]
data JQuery
Run Code Online (Sandbox Code Playgroud)

这就是fay-jquery所做的,它允许库的用户轻松定义新的FFI绑定,因此您的大小示例可以正常工作.但请注意,它已在jQuery中被弃用,因此最length好像John B所建议的那样使用它.

每当fay遇到应该是JQuery类型的东西时,它都不会触及它,所以你将直接引用javascript对象.

记录

另一种方法是将javascript对象映射到记录,如果有问题的对象容易映射,例如处理JSON或进行客户端 - 服务器通信时,这是更好的选项.

data User = User { name :: String }

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

userB :: User
userB = User { name = "Adam" }
Run Code Online (Sandbox Code Playgroud)

这些是构建用户记录的相同方式,但userA当然有点人为,在这种情况下,可能会从服务器端或某些JS库获取值(否则根本没有理由使用FFI)

在此记录案例中,您将不会保留对JS对象的引用,将实例化不可变的用户记录.

我也认为你可以跳过Fay返回类型.我认为可以安全地假设jQuery对象不会发生变异,特别是如果它们是从Fay实例化的话.

length :: JQuery -> Int
length = ffi "%1['length']"
Run Code Online (Sandbox Code Playgroud)

另请参阅FFI wiki页面.

编辑:有点相关,fay-uri是一个记录良好且相当简单的示例,说明如何在可变js库之上构建不可变FFI层.