2017-01-01 6 views
7

के साथ फ़ाइल इनपुट सामग्री प्राप्त करना मैंने HTML फ़ाइल फ़ाइल API का उपयोग करके जावास्क्रिप्ट में फ़ाइल इनपुट से सामग्री पढ़ने के लिए simple ways देखा है।फ़ेबल

यह मेरा view विधि, एक छोटे से fable-arch एप्लिकेशन के अंदर है:

let view model = 
    div [ 
     attribute "class" "files-form" 
    ] [ 
     form [ 
      attribute "enctype" "multipart/form-data" 
      attribute "action" "/feed" 
      attribute "method" "post" 
     ] [ 
      label [ attribute "for" "x_train" ] [ text "Training Features" ] 
      input [ 
       attribute "id" "x_train" 
       attribute "type" "file" 
       onInput (fun e -> SetTrainingFeaturesFile (unbox e?target?value)) 
      ] 
     ] 
     model |> sprintf "%A" |> text 
    ] 
  • वहाँ फ़ाइल एफ # से सीधे सामग्री पर कब्जा करने का आसान तरीका है?
  • इसे पूरा करने के लिए आवश्यक इंटरऑप फेल कोड की न्यूनतम मात्रा क्या है?

उत्तर

5

मैं एक तरह से करने के लिए मुख्य रूप से सादे जावास्क्रिप्ट नहीं लिख क्योंकि मैं आयात नहीं कर सका/कल्पित कहानी से दृष्टांत FileReader नहीं पा सके। अगर कोई ऐसा कर सकता है, तो समाधान शायद बेहतर हो सकता है।

फ़ाइल पढ़ना असीमित है। इसका मतलब है कि दृश्य में देरी मॉडल अपडेट उत्पन्न करना चाहिए। चूंकि इसे मॉडल अपडेट फ़ंक्शन में ही किया जा सकता है, इसलिए मुझे एक जावास्क्रिप्ट फ़ाइल हैंडल को अंदर भेजना पड़ा।

सादे जावास्क्रिप्ट सिर्फ एक निर्यात हैक

// file interops.js, can I get rid of this? 
export var getReader = function() { return new FileReader(); } 

दृश्य

// view code 
input [ 
    attribute "id" "x_train" 
    attribute "type" "file" 
    onInput (fun e -> FromFile (SetField, e?target?files?(0))) 
] 

तो संदेश वास्तव में एक "फाइल सामग्री के साथ विलंबित संदेश" है में है। यहाँ कार्रवाई और अद्यतन कोड है:

type Action = 
    | SetField of string 
    | FromFile of (string -> Action) * obj 

let update model action = 
    match action with 
    | SetField content -> 
     { model with Field = content}, [] 
    | FromFile (setAction, file) -> 
     let delayedAction h = 
      let getReader = importMember "../src/interops.js" 
      let reader = getReader() 
      reader?onload <- (fun() -> h <| setAction !!reader?result) 
      reader?readAsText file |> ignore 
     model, delayedAction |> toActionList 

FromFile एक जटिल कार्य है क्योंकि मैं इसे उपयोग करने के लिए एक से अधिक क्षेत्र सेट करना चाहते हैं। यदि आपको केवल एक की आवश्यकता है, तो आप इसे केवल of obj बना सकते हैं।

+0

फेल चैनल में सभी सुझावों के लिए धन्यवाद @MangelMaxime। :-) – VillasV