2014-01-12 51 views
2

我正在嘗試使用threepenny來了解FRP。將一個文本框和按鈕點擊到`UI(Event String)'

我想生成包含用戶輸入的事件,並在每次單擊按鈕時觸發。您可以在github上看到代碼。

我試着功能

submitEvents :: Element -> Element -> UI (Event String) 
submitEvents button input = do val <- get value input 
           return $ val <$ (UI.click button) 

這樣做,它是後來用在像這樣一個do塊。

nameE <- submitEvents loginButton userNameInput 
currName <- stepper "Ash" nameE 
element currNameElem # sink text currName 

但它最終只是成爲空字符串第一次點擊後。在此之前,它包含值「灰」如預期。我認爲正在發生的事情是,當我生成事件流時,輸入的值將被提取,而不是每次點擊一次。我環顧了文檔,並沒有看到m a -> Event() -> m (Event a)的任何內容,但我對frp很陌生,可能錯過了一些東西。

+1

正如您已經注意到的那樣,值'val'不隨時間變化,它是調用'get'時的輸入小部件的值,即構造事件流時的值。你也可以通過查看它的類型來看到它:'val :: String',這是不會隨時間變化的。相反,'currName :: Behavior String',表示一個隨時間變化的'String'。 –

回答

1

哦,我明白了。我正在構建我需要從UI.valueChange

submitEvents :: Element -> Element -> UI (Event String) 
submitEvents button input = do currVal <- stepper "" $ UI.valueChange input 
           return $ currVal <@ (UI.click button) 

很好用。我不確定是否有一種更有效的方式,只有在按下按鈕時纔會看到它。如果有人找到更好的答案,我會將問題留給公衆。

+1

這是規範的做法(從threepenny-gui-0.4。*開始)。看起來效率低下的問題是一個紅鯡魚,因爲底層的JS實現必須隨着每次按鍵更新值,所以沒有辦法「只在按下按鈕時才查看」。 –

相關問題