0

Halogen UI でタイム スパンをレンダリングするために使用したい moment.js へのバインディングがいくつかあります。

diffMins :: forall eff. Moment -> Moment -> Eff (now :: NOW | eff) Number

この関数を UI で次のように使用する場合:

H.span_ [H.text $ diffMins (fromEpoch_ 0) (fromEpoch_ myTimeStamp)]

でもこれは入っEffてるから仕方ない。

私ができることは、この関数で瞬間を呼び出すことです:

js:

exports.duration_ = function (millis) {
    return moment.duration(millis).humanize();
};

PS:

foreign import duration_ :: Number -> String

humanizeMilliseconds :: Milliseconds -> String
humanizeMilliseconds (Milliseconds n) = duration_ n

私の質問(またはいくつか):

Eff.であると言わずに JavaScript を呼び出すのは「不正行為」ですか? そうでない場合、いつ大丈夫と見なされ、そうでない場合はいつですか?どちらの方法でも、これらの機能が副作用であるかどうかを確認できます。

私が今電話している方法を変更できなかった場合、または実際にそれが悪い考えである場合、でこれを行う方法はありHTMLますか?

4

1 に答える 1

2

Halogen でのレンダリング中に効果的なことを実行することは実際には不可能HTMLですstate -> HTML

Phil がコメントで述べているようにEff、FFI 関数のシグネチャで使用する必要はありません。この場合、基本的に日付の算術演算であるため、おそらく安全ですが、ロケール固有の処理が行われている可能性があります。もしそうなら、OSクロックが台無しにされない限り、少なくとも同じマシンで常に同じ結果が得られるため、少し危険です。それをエフェクトフリーとして受け入れるのは少しためらいますが、それが本当に問題であり、それを行う必要がある場合は、少なくとも関数がエクスポートされていないことを確認して、例外的な状況。

ただし、コンポーネントのevalどこかでこれを実行し、値をコンポーネントの状態に保存することもできます-myTimeStampすでにそこにある必要があるため、この値を同時に計算できますか? そうすれば、それぞれで静的な値を再計算することもありませrenderん。

于 2017-01-05T20:17:27.090 に答える