为了账号安全,请及时绑定邮箱和手机立即绑定

无法从模板操作 DOM 以添加/删除属性

无法从模板操作 DOM 以添加/删除属性

Go
慕姐4208626 2022-10-10 19:36:09
在我的代码中,我想根据用户身份验证级别禁用一些输入字段,我可以在 JavaScript 中做到这一点,但这是不推荐的解决方案,我想从服务器端做到这一点。以下是我的go代码;package mainimport (    "context"    "html/template"    "net/http"    "strings"    "time")type User struct {    Flags string    Title string}type UsersPageData struct {    PageTitle string    Users     []User}func requestTime(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        ctx := r.Context()        ctx = context.WithValue(ctx, "requestTime", time.Now().Format(time.RFC3339))        r = r.WithContext(ctx)        next.ServeHTTP(w, r)    })}func helloHandler(name string) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        var title string        if requestTime := r.Context().Value("requestTime"); requestTime != nil {            if str, ok := requestTime.(string); ok {                title = "\ngenerated at: " + str            }        }        master := strings.Join([]string{"admin", "user", "superuser", "read"}, " ")        admin := strings.Join([]string{"admin"}, " ")        user := strings.Join([]string{"user"}, " ")        tmpl := template.Must(template.ParseFiles("index.html"))        data := UsersPageData{            PageTitle: "Users list: " + title,            Users: []User{                {Flags: master, Title: "Everything"},                {Flags: admin, Title: "Administrator"},                {Flags: user, Title: "Normal user"},            },        }        tmpl.Execute(w, data)    })}func main() {    http.Handle("/john", requestTime(helloHandler("John")))    http.ListenAndServe(":8080", nil)}这是我的模板,包括 JS 代码;<style>.admin {    color: green;}.user {    color: red;    --btn-disable: 0;}[data-authorized="no"] {  /* Attribute has this exact value */        cursor: not-allowed;        pointer-events: none;        /*Button disabled - CSS color class*/        color: #c0c0c0;        background-color: rgb(229, 229, 229) !important;}
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

在完整代码下方,借助模板自定义函数,我能够做到这一点:


package main


import (

    "html/template"

    "net/http"

)


type User struct {

    Flags []flag //string

    Title string

}


type UsersPageData struct {

    PageTitle string

    Users     []User

}


type flag int


const (

    Admin flag = iota + 1 // iota = 0

    Editer

    Superuser

    Viewer

    Dummy

)


func subtract(arg1, arg2 int) int {

    return arg1 - arg2

}


func helloHandler(name string) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        // Map the `subtract` custom function in the template

        funcMap := map[string]interface{}{"subtract": subtract}


        master := []flag{Admin, Editer, Superuser, Viewer}

        admin := []flag{Admin, Superuser, Viewer}

        user := []flag{Viewer, Dummy}


        tmpl := template.New("").Funcs(template.FuncMap(funcMap))

        template.Must(tmpl.ParseFiles("index.html"))

        data := UsersPageData{

            PageTitle: "Users list: ",

            Users: []User{

                {Flags: master, Title: "Everything"},

                {Flags: admin, Title: "Administrator"},

                {Flags: user, Title: "Normal user"},

            },

        }

        tmpl.ExecuteTemplate(w, "index.html", data)

    })

}


func main() {

    fs := http.StripPrefix("/www/", http.FileServer(http.Dir("./www")))

    http.Handle("/www/", fs)


    http.Handle("/", helloHandler("John"))

    http.ListenAndServe(":8080", nil)

}

是index.html:


<html>

{{/* This is a comment 

{{$flags := []flag{Admin, Editer, Superuser, Viewer};}} 

    Admin Flag = iota + 1 // iota = 0

    Editer

    Superuser

    Viewer

    }}

*/}}


<ul>

    {{range .Users}}

        <span>{{.Title}}</span>

        {{ $done := false}} {{$length := len .Flags}}

        {{range $i, $v := .Flags}}

            {{ if $done }}

            {{ else }}

                {{if or (eq $v 1) (eq $v 3)}} 

                    <input type="text" name="subject" placeholder= {{$v}} required>

                    {{ $done = true }}

                {{else}}

                    {{ if eq $i (subtract $length 1)}}

                        <input type="text" name="subject" placeholder= {{$v}} disabled>

                    {{ end }}

                {{end}}

            {{end}}

        {{end}}

    {{end}}

</ul>

</html>

//img1.sycdn.imooc.com//634403d20001f7f114970378.jpg

查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信