2016-09-26 94 views
1

我想引用来自FFI函数定义,以便返回一个Javascript对象,以能够操纵以后的对象:如何从JSFunction返回JSObject?

import   Data.Aeson 
import   Foreign.JavaScript (JSObject, NewJSObject, unsafeCreateJSObject) 
import   Foreign.RemotePtr (RemotePtr) 
import   Graphics.UI.Threepenny.Core hiding (text) 

mkJSObject :: JSFunction NewJSObject -> UI JSObject 
mkJSObject f = askWindow >>= liftIO . flip unsafeCreateJSObject f 

polyLine :: [[Double]] -> Value -> UI JSObject 
polyLine points = mkJSObject . f points 
    where 
    f :: [[Double]] -> Value -> JSFunction NewJSObject 
    f = ffi "L.polyline(%1, %2).addTo(map)" 

但底层的Javascript窗口似乎并没有被公开无障碍。有没有另外一种创建Javascript对象引用的方法?

+0

这看起来好像没什么问题。在我看来,你已经回答了你自己的问题? –

+0

是的,但也许答案对其他人也有帮助。感谢三penny-gu btw,精心设计,非常有用! – kaoskorobase

+0

当然。 :-)但是,你能否削减答案并将其粘贴在下面?这会让其他人更容易理解。谢谢,我很高兴你喜欢它。 :-) –

回答

1

它其实更简单:只需从JSFunction返回一个JSObject,它会被正确整理:

polyLine :: [[Double]] -> Value -> UI JSObject 
polyLine points = callFunction . f points 
    where 
    f :: [[Double]] -> Value -> JSFunction JSObject 
    f = ffi "L.polyline(%1, %2).addTo(map)"