2016-09-26 1 views
1

Je voudrais renvoyer une référence à un objet Javascript à partir d'une définition de la fonction de FFI afin de pouvoir manipuler l'objet plus tard:Comment retourner JSObject à partir de JSFunction?

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)" 

Mais le Javascript fenêtre sous-jacente ne semble pas être publiquement accessible. Existe-t-il un autre moyen de créer des références aux objets Javascript?

+0

Cela semble bien pour moi. Il me semble que vous avez répondu à votre propre question? –

+0

Oui, mais peut-être que la réponse est utile pour les autres aussi. Merci pour threepenny-gui btw, bien conçu et extrêmement utile! – kaoskorobase

+0

Bien sûr. :-) Mais pourriez-vous couper la réponse et le coller ci-dessous? Cela faciliterait la compréhension des autres plus tard. Et merci, je suis content que tu aimes ça. :-) –

Répondre

1

Il est en fait beaucoup plus simple: Il suffit de retourner un JSObject de fonctionJS et il sera rangea correctement:

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