问题描述

我使用Gorilla Websocket来更新一些HTML(img src,text等);我这样做的方式如下:

  mt,message,err:= c.ReadMessage()
if err! = nil {
log.Println(read:,err)
break
}
[...]
app,err:= models.DB。 SearchAppStore(ctx,stars,updatedWithin,0)
myJson,err:= json.Marshal(app)
err = c.WriteMessage(mt,myJson)
if err!= nil {
log.Println(write:,err)
break
}



然后我使用javascript来更新HTML数据:

  ws.onmessage = function(evt){
var d = JSON.parse(evt.data);
var app; (app = 0; app< 3; app ++){
document.getElementById(app-icon-+ app).src = d [app] .ThumbnailURL;
;
document.getElementById(app-title-+ app).innerHTML = d [app] .Title;
document.getElementById(app-compatibility-+ app).innerHTML = d [app] .Compatibility;
}
};

然后我用这种方式手动输入HTML:

 < div class =app-section> 
< div class =icon>
< img src =id =app-icon-0>
< / div>
< div class =details>
< h2 id =app-title-0>< / h2>
< h5 id =app-compatibility-0>< / h5>
< / div>
< / div>

你可以在HTML的id中看到0,我应该注意它更长,但是我试图只采取相关的部分..



当然我不想手动键入HTML,因为它会使处理不同的长度变得困难(/不可能)像有时候我想显示一百个应用程序,其他时间也许只有3个可用,等等。)



我想这可能能够完成使用golang的HTML {{range}}函数,但我无法弄清楚如何将它与来自websockets的json数据整合。

 ws.onmessage 
 Object.k eys(d).length; 


..但我一直无法弄清楚如何去做,也许这是不可能的..我将不胜感激任何帮助如何做到这一点..

一种简单的方法是在服务器上执行一个模板,并将生成的HTML发送到插入HTML的客户端该页面。



用编译模板声明包级变量。
此模板假定Execute的参数是一块
结构或带有字段ThumbnailURL,标题和兼容性的地图。

  var t = template.Must(template.New()。Parse(`{{range。}} 
< div class =icon>
< img src ={{。ThumbnailURL}}>
< / div>
< div class =details>
< h2> {{。Title}}< ; / h2>
{{。Compatibility}}< / h5>
< / div> {{end}}`))

在读取循环中执行模板。发送HTML到客户端:

  mt,message,err:= c.ReadMessage()
if err! = nil {
log.Println(read:,err)
break
]
[...]
app,err:= models.DB。 SearchAppStore(ctx,stars,updatedWithin,0)
var buf bytes.Buffer
if err:= t.Execute(& buf,app); err!= nil {
//处理错误
}
err = c.WriteMessage(mt,buf.Bytes())
if err!= nil {
log.Println(write:,err)
break
}

在页面中包含结果div:

 < div class =app-section>< / div> ; 

在接收到消息时设置div的内部HTML:

  ws.onmessage = function(evt){
document.getElementById(app-section)。innerHTML = evt.Data;
}

此解决方案不使用JSON。

I'm using Gorilla Websocket to update some HTML (img src, text, etc); I do this the following way:

mt, message, err := c.ReadMessage()
if err != nil {
    log.Println("read:", err)
    break
}
[...]
app, err := models.DB.SearchAppStore(ctx, stars, updatedWithin, 0)
myJson, err := json.Marshal(app)
err = c.WriteMessage(mt, myJson)
if err != nil {
    log.Println("write:", err)
    break
}

Then I use javascript to update the HTML data this way:

ws.onmessage = function(evt) {
    var d = JSON.parse(evt.data);
    var app;
    for (app = 0; app < 3; app++) {
      document.getElementById("app-icon-" + app).src = d[app].ThumbnailURL;
      document.getElementById("app-title-" + app).innerHTML = d[app].Title;
      document.getElementById("app-compatibility-" + app).innerHTML = d[app].Compatibility;
    }
  };

And then I have manually typed the HTML this way:

<div class="app-section">
  <div class="icon">
    <img src="" id="app-icon-0">
  </div>
  <div class="details">
    <h2 id="app-title-0"></h2>
    <h5 id="app-compatibility-0"></h5>
  </div>
</div>

You can see the 0 in the HTML 'id's, and I should note that it's much longer but I tried to only take the relevant parts..

var t = template.Must(template.New("").Parse(`{{range .}}
  <div class="icon">
   <img src="{{.ThumbnailURL}}">
  </div>
  <div class="details">
   <h2>{{.Title}}</h2>
   <h5>{{.Compatibility}}</h5>
  </div>{{end}}`))
mt, message, err := c.ReadMessage()
if err != nil {
   log.Println("read:", err)
   break
]
[...]
app, err := models.DB.SearchAppStore(ctx, stars, updatedWithin, 0)
var buf bytes.Buffer
if err := t.Execute(&buf, app); err != nil {
    // handle error
}
err = c.WriteMessage(mt, buf.Bytes())
if err != nil {
  log.Println("write:", err)
  break
}
<div class="app-section"></div>
ws.onmessage = function(evt) {
    document.getElementById("app-section").innerHTML = evt.Data;
}