2017-08-19 2 views
3
私が正しく、次のコードをコンパイルするフェイブルを取得しようとしているが、そうすることができませんよ

呼び出すESサードパーティのスクリプトメソッド

module AppView 
#r "../../../node_modules/fable-core/Fable.Core.dll" 
open Fable.Core 
open Fable.Import.Browser 
open Fable.Core.JsInterop 
[<Import("default", from="../../../js/3rd/riot.js")>] 
module riot_js = 
    let mount:((string*obj)->array<obj>) = jsNative 

type App 
    (
    tagName:string 
    ,state 
    ,store 
) = 
    member public x.AppTag = 
    (riot_js?mount ("app", state)) 
    // does not compile: The value or constructor 'riot_js' is not defined. 
    // (riot_js.mount ("app", state)) 
    // compiles wrongly to: riot_js.mount(["app", this.state]); 

riot_js?mountは魔法riot_jsがこれ以上存在しないために原因となるしよう試してriot_js.mountriot_js.mount(["app", this.state]);にコンパイルしてみてください。

マウントには引数が1つではなく2つではありませんが、間違っていたり間違っていたりしません。今の

私は奇妙な探して解決策のいずれかを持っている:

[<Emit("riot_js")>] 
let riot_js (x: int): obj = jsNative 
... 
((riot_js 1)?mount ("app", state)) 

これは配列を返しますが、再びフェイブルは私が「正常な」方法で、最初の要素を取ることはできません。

((riot_js 1)?mount ("app", state))?[0] 

はエラーで[に私に赤を与えるUnexpected symbol '[' in expression. Expected identifier, '(' or other token.

そして

((riot_js 1)?mount ("app", state)).[0] 

はエラーThe field, constructor or member 'Item' is not defined.

ですべてで次のように赤い与える

((riot_js 1)?mount ("app", state))?``0`` 

"作品" とにコンパイルされます。

riot_js.mount("app", this.state)["0"]; 

ない誰かが得ることができる最高の結果。私はこの質問をしばらく置いておき、Fableとの2つの問題を開く前に1週間ほどそれに賞金を設定します。

答えて

0

以下は正しいESにコンパイルされているようで、?は強く入力される必要はありません。

open Fable.Core.JsInterop 
type Riotjs = 
    { 
    mount:(System.Func<string,obj,string []>) 
    } 
let riot = (importAll<obj> "../js/3rd/riot.js") :?> Riotjs 
let app = riot.mount.Invoke("app",(createObj [])) 

私はobjを入力する初期状態を設定するが、同様に強い型付けされたアプリケーションの状態を使用することができます。生成された

ESは次のとおりです。

export var app = riot.mount("app", {}); 
関連する問題