github.com/vugu/vugu@v0.3.5/vugufmt/testdata/ok/root.vugu (about) 1 <div class='demo-comp'> 2 <div vg-if='data.isLoading'>Loading...</div> 3 4 5 <div 6 vg-if='len(data.bpi.BPI) > 0'> 7 <div>Updated: <span vg-html='data.bpi.Time.Updated'></span></div> 8 <ul> 9 <li vg-for='data.bpi.BPI'> 10 <span vg-html='key'></span> <span vg-html='fmt.Sprint(value.Symbol, value.RateFloat)'></span> 11 </li> 12 </ul> 13 </div> 14 <button @click='data.HandleClick(event)'>Fetch Bitcoin Price Index</button> 15 </div> 16 17 <script type='application/x-go'> 18 import "encoding/json" 19 import "net/http" 20 import "log" 21 22 type RootData struct { 23 bpi bpi 24 isLoading bool 25 } 26 27 type bpi struct { 28 Time struct { 29 Updated string `json:"updated"` 30 } `json:"time"` 31 BPI map[string]struct { 32 Code string `json:"code"` 33 Symbol string `json:"symbol"` 34 RateFloat float64 `json:"rate_float"` 35 } `json:"bpi"` 36 } 37 38 func (data *RootData) HandleClick(event vugu.DOMEvent) { 39 40 data.bpi = bpi{} 41 42 go func(ee vugu.EventEnv) { 43 44 ee.Lock() 45 data.isLoading = true 46 ee.UnlockRender() 47 48 res, err := http.Get("https://api.coindesk.com/v1/bpi/currentprice.json") 49 if err != nil { 50 log.Printf("Error fetch()ing: %v", err) 51 return 52 } 53 defer res.Body.Close() 54 55 var newb bpi 56 err = json.NewDecoder(res.Body).Decode(&newb) 57 if err != nil { 58 log.Printf("Error JSON decoding: %v", err) 59 return 60 } 61 62 ee.Lock() 63 defer ee.UnlockRender() 64 data.bpi = newb 65 data.isLoading = false 66 67 }(event.EventEnv()) 68 } 69 70 </script>