我在我的Fable-F#项目中使用vis.js依赖项,并希望调用网络功能以可视化显示网络。如何将JSON数据从F#传递到网络功能?
用于导入模块的F#代码
open Fable.Import.React
open Fable.Helpers
open Fable.Helpers.React
open Fable.Helpers.React.Props
open Fable.Core
open Fable.Core.JsInterop
open Fable.Import
open Fable.Import.Browser
[<Import("default", "vis")>]
let Network (we: React.event) = jsNative
let destination = Browser.document.getElementById "app"
let response = Network destination JsonData options
采用三个参数Github
的Vis.js节点模块代码 function Network(container, data, options) {
if (!(this instanceof Network)) {
throw new SyntaxError('Constructor must be called with the new operator');
}
// set constant values
this.options = {};
this.defaultOptions = {
locale: 'en',
locales: locales,
clickToUse: false
使用JS和HTML Github作为参考的图形
答案 0 :(得分:1)
要使用vis库,您可以按照以下步骤操作:
index.d.ts
文件的内容vis.fs
中的示例)。您将有4个错误(在编写此答案时)。您可以注释相应的行。对我来说
// At the top of the file
type MomentInput = Moment.MomentInput
type MomentFormatSpecification = Moment.MomentFormatSpecification
type Moment = Moment.Moment
// In the middle of it
type [<AllowNullLiteral>] TimelineStatic =
interface end
vis.js
库这是移植的简单网络代码:
// Fable demo ported from http://visjs.org/examples/network/basicUsage.html
module Client
open Fable.Core
open Fable.Core.JsInterop
open Fable.Import
// We import the vis.css style
importSideEffects "vis/dist/vis.css"
// We create an access to the vis library
// We could put it under vis.fs file but it's easier to access it from here
[<Import("*", "vis")>]
let visLib : vis.IExports = jsNative
// Helper to make the code easier to read
let createNode id label =
jsOptions<vis.Node>(fun o ->
o.id <- Some !^id
o.label <- Some label
)
// Helper to make the code easier to read
let createEdge from ``to`` =
jsOptions<vis.Edge>(fun o ->
o.from <- Some !^from
o.``to`` <- Some !^``to``
)
// If I was using this library I would probably write some helpers to have something like:
// Node.empty
// |> Node.withId 1
// |> Node.withLabel "My label"
// |> ...
// Like that the code is cleaner and more flexible
// From here this is almost a 1 to 1 with the JavaScript code
let nodes =
ResizeArray([|
createNode 1. "Node 1"
createNode 2. "Node 2"
createNode 3. "Node 3"
createNode 4. "Node 4"
createNode 5. "Node 5"
|])
|> visLib.DataSet.Create
let edges =
ResizeArray([|
createEdge 1. 3.
createEdge 1. 2.
createEdge 2. 4.
createEdge 2. 5.
createEdge 3. 3.
|])
|> visLib.DataSet.Create
let datas =
jsOptions<vis.Data>(fun o ->
o.nodes <- Some (U2.Case2 nodes)
o.edges <- Some (U2.Case2 edges)
)
let container = Browser.document.getElementById("elmish-app");
// Because we don't have any option to pass, we need to give an empty object
// otherwise vis.js failed at runtime
let network = visLib.Network.Create(container, datas, createEmpty)