【问题标题】:It is possible to bind a golang channel into a template可以将 golang 通道绑定到模板中
【发布时间】:2017-06-17 05:02:09
【问题描述】:

我有这样的 go 模板 (upload.tmpl.html):

<html>
<body>
  <div class="container">
    <ul>
      <li>current fileName : {{ .fileName}} </li>
    </ul> 
</body>
</html>

一个处理程序uploadHandler.go

func UploadHandler(c *gin.Context) {
    file, header, err := c.Request.FormFile("file-upload")
    if err != nil {
        log.Fatal("Erreur dans la récupération de fichier")
    }
    //...
    fileName := make(chan string)

    go ReadCsvFile(bytes, fileName)
    go func() {
        for {
            log.Info(<-fileName)
        }
    }()

    c.HTML(http.StatusOK, "upload.tmpl.html", gin.H{
        "fileName":    <-fileName,
    })
}

还有类似的ReadCsvFile() 方法:

func ReadCsvFile(bytesCSV []byte, fileName chan string) {
    r := bytes.NewReader(bytesCSV)
    reader := csv.NewReader(r)
    reader.Comma = ';'

    records, err := reader.ReadAll()

    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    db, _ := databaseApp.OpenDatabase()
    defer db.Close()
    for _, record := range records {
        fileName <- record[0]
        product := &em.Product{
            Name:        record[0],
            //...
        }
        db.Create(product)

    }
    fileName <- "done"
}

我尝试在模板中显示每一行的当前文件名,但是可以像这样将通道绑定到模板中吗?因为这样页面就不再加载了。

【问题讨论】:

  • 渲染后你能做的就是使用ajax/js“刷新”页面

标签: go go-templates


【解决方案1】:

使用 Websocket。以下是一些示例:

HTML/JavaScript:

<script>
    var ws= new WebSocket("ws://yoursite.com");
    ws.onmessage = function (event) {
        console.log(event.data);
        // $('#your-element').html(event.data);
    }
</script>

转到 Websocket:

func websocketSenderHandler(conn *websocket.Conn){
    for {
        msg := <- globalChannel
        conn.WriteMessage(websocket.TextMessage, msg)
    }
}

Go 中的更多 Websocket:golang.org/x/net/websocket

其他示例:https://github.com/golang-samples/websocket

【讨论】:

  • 抱歉,不应该是websocket.Message.Send(conn, &amp;msg)吗?我在那里看不到WriteMessage() 函数,只有一个Write() 用于与io.Write() 接口兼容?
  • 基于这个issuecommit 使用std websocket 包不是一个最好的主意。 [Gorilla websocket](github.com/gorilla/websocket)更可取。
  • @olegkovalov 我的例子是 gorilla websocket。
  • @dit [More Websockets in Go](golang.org/x/net/websocket) 指向 std 包,这就是我提到弃用的原因
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多