2016-11-16 37 views
2

我在elm中收到未捕獲的typeerror,不知道爲什麼。未捕獲TypeError:無法讀取undefined屬性「星期」

我從api解碼json字符串; api列出rostars,每個rostar都有或者 a planningId或者flexplanningId。我想要在列表中映射,並根據planningIdflexplanningId根據其具體情況爲每個planning分配一個唯一的id。下面的代碼:

記錄定義和解碼器:

type alias Rostar = 
    { employee : Employee } 


type alias Employee = 
    { week : Week 
    , name : String 
    , id : Int 
    , contractHours : Float 
    } 


type alias Week = 
    { monday : List Planning 
    , tuesday : List Planning 
    , wednesday : List Planning 
    , thursday : List Planning 
    , friday : List Planning 
    , saturday : List Planning 
    , sunday : List Planning 
    } 


type alias Planning = 
    { time : String 
    , planningId : Maybe Int 
    , groupId : Int 
    , groupName : String 
    , flex : Bool 
    , employeeTimeslotId : Maybe Int 
    , flexplanningId : Maybe Int 
    , employeeId : Maybe Int 
    , id : Maybe Int 
    } 


responseDecoder : Decoder (List Rostar) 
responseDecoder = 
    list rostarDecoder 


rostarDecoder : Decoder Rostar 
rostarDecoder = 
    decode Rostar 
     |> required "employee" employeeDecoder 


employeeDecoder : Decoder Employee 
employeeDecoder = 
    decode Employee 
     |> required "rostar" weekDecoder 
     |> required "name" string 
     |> required "id" int 
     |> required "contract_hours" float 


weekDecoder : Decoder Week 
weekDecoder = 
    decode Week 
     |> required "monday" (list planningDecoder) 
     |> required "tuesday" (list planningDecoder) 
     |> required "wednesday" (list planningDecoder) 
     |> required "thursday" (list planningDecoder) 
     |> required "friday" (list planningDecoder) 
     |> required "saturday" (list planningDecoder) 
     |> required "sunday" (list planningDecoder) 


planningDecoder : Decoder Planning 
planningDecoder = 
    decode Planning 
     |> required "time" string 
     |> optional "planning_id" (nullable int) Nothing 
     |> required "group_id" int 
     |> required "group_name" string 
     |> required "flex" bool 
     |> optional "employee_timeslot_id" (nullable int) Nothing 
     |> optional "flexplanning_id" (nullable int) Nothing 
     |> required "employee_id" (nullable int) 
     |> hardcoded Nothing 

映射:

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     HandleFeedResponse response -> 
      let 
       assignPlanningId : Planning -> Planning 
       assignPlanningId planning = 
        case planning.planningId of 
         Just id -> 
          { planning | id = Just (id + 10000000) } 

         Nothing -> 
          case planning.flexplanningId of 
           Just id -> 
            { planning | id = Just (id + 90000000) } 

           Nothing -> 
            { planning | id = Nothing } 

       planningWithId : List Planning -> List Planning 
       planningWithId day = 
        List.map assignPlanningId day 

       mapWeek : Week -> Week 
       mapWeek week = 
        { week 
         | monday = planningWithId week.monday 
         , tuesday = planningWithId week.tuesday 
         , wednesday = planningWithId week.wednesday 
         , thursday = planningWithId week.thursday 
         , friday = planningWithId week.friday 
         , saturday = planningWithId week.saturday 
         , sunday = planningWithId week.sunday 
        } 

       updateResponse : List Rostar 
       updateResponse = 
        List.map 
         (\r -> 
          let 
           employee = 
            { employee | week = mapWeek employee.week } 
          in 
           { r | employee = employee } 
         ) 
         response 

       check = 
        Debug.log "updatedResponse" updateResponse 
      in 
       { model | rostar = updateResponse } ! [] 

這裏是我得到的錯誤:

Uncaught TypeError: Cannot read property 'week' of undefined Blockquote

感謝幫幫我!

回答

0

這可能不是你的錯誤, 的來源,但你的員工解碼器說,它需要一個rostar變量,它包含一個week。它是否正確?還是應該叫week

這裏是代碼片段:

employeeDecoder : Decoder Employee 
employeeDecoder = 
    decode Employee 
--  |> required "rostar" weekDecoder -- is this correct? 
     |> required "week" weekDecoder  -- what I would have expected 
     |> required "name" string 
     |> required "id" int 
     |> required "contract_hours" float 
1

我覺得你的問題是由letupdateResponse映射函數employee結合造成的。標籤employee已經存在,所以這一行導致遞歸定義。

let 
    employee = 
     { employee | week = mapWeek employee.week } 

在榆樹0.18,這是一個編譯錯誤,並給你一個詳細的錯誤信息,而不是離開的可能性爲一個運行時錯誤:

Detected errors in 1 module.

-- BAD RECURSION ------------------------------------------------------ Main.elm 

employee is defined directly in terms of itself, causing an infinite loop.

132|>        employee = 
133|          { employee | week = mapWeek employee.week } 

Maybe you are trying to mutate a variable? Elm does not have mutation, so when I see employee defined in terms of employee , I treat it as a recursive definition. Try giving the new value a new name!

Maybe you DO want a recursive value? To define employee we need to know what employee is, so let’s expand it. Wait, but now we need to know what employee is, so let’s expand it... This will keep going infinitely!

To really learn what is going on and how to fix it, check out: https://github.com/elm-lang/elm-compiler/blob/0.18.0/hints/bad-recursion.md

此前0.18,我會看到這些類型的奇怪的「未定義」運行時錯誤,當意外執行某種非預期的遞歸。在0.18中,他們爲一些最基本的問題添加了編譯器檢查。

相關問題