2016-09-07 4 views
2

テンプレートに構造体の配列を渡していますが、そのデータはありますが、特定のデータにアクセスする方法が見つからないため、多くのことを試しました。ここでは私のテンプレートの構造体の配列にアクセスする

私のStruct

type Data struct { 
    Destination string 
    IData interface{} 
} 

その後、私のコントローラで私は

users := []models.User {} 

userRow := models.User{Name: "jon", Email: "[email protected]"} 
users = append(users, userRow) 
users2 := users 

data := models.Data{ 
    Destination: "content", 
    IData: users, 
} 

data2 := models.Data{ 
    Destination: "content", 
    IData: users2, 
} 

dataFinal := []models.Data{} 
dataFinal = append(dataFinal, data) 
dataFinal = append(dataFinal, data2) 

を持っており、これは、これが動作するようには思えませんでしたが、それは生データを示すが、できないん、私のテンプレートです特定の名前にアクセスするようです同盟国。

{{define "content"}} 
<h2>THIS IS THE BODY CONTENT</h2> 

<ul> 
    {{.}} 
    {{range .}} 
    <li>{{.}}</li> 
    {{end}} 
</ul> 
{{end}} 

編集: プロジェクト:https://github.com/og2/go-og2-mvc

あなたが実行したいことがあります。

githubのを取りに行くgithub.com/go-sql-driver/mysql

を取りに行きます。 com/julienschmidt/httprouter

o仕事とうまくいくはずです!

答えて

2

あなたは"content"テンプレートの実行に渡すパイプライン値がdataFinalであれば、あなたはdataFinal自体として2つの{{range}}アクションを使用する必要があります(タイプ[]models.Dataの)スライスで、かつData.IDataも(タイプ[]model.Userの)スライスであります。

<li>{{.Name}}</li> 

この作業の例を参照してください:あなたはUser.Name.Nameようにすることを指して、内側{{range}}インサイド

const templ = `{{define "content"}} 
<h2>THIS IS THE BODY CONTENT</h2> 

<ul> 
    {{.}} 
    {{range .}} 
    <ul> 
     {{range .IData}} 
     <li>{{.Name}}</li> 
     {{end}} 
    </ul> 
    {{end}} 
</ul> 
{{end}}` 

// Parsing and executing the template: 
t := template.Must(template.New("").Parse(templ)) 
fmt.Println(t.ExecuteTemplate(os.Stdout, "content", dataFinal)) 

出力(Go Playground上でそれを試してみてください):

<h2>THIS IS THE BODY CONTENT</h2> 

<ul> 
    [{content [{jon [email protected]}]} {content [{jon [email protected]}]}] 

    <ul> 

     <li>jon</li> 

    </ul> 

    <ul> 

     <li>jon</li> 

    </ul> 

</ul> 
<nil> 
+0

ニース。テンプレートエンジンがアサーションやリフレクションに十分スマートであるかどうか分かりませんでした。提供されたIDataは、インタフェース{}だけではなく、スライスです。 – Uvelichitel

+0

@Uvelichitelテンプレートエンジンはリフレクションを使用します。 'Execute()'と 'ExecuteTemplate()'は 'interface {}'としてデータを受け取ります。そうでない場合、渡されたスライスの範囲を越えることはできません( ' {} '値)。 – icza

+0

@iczaうまくいくようですが、ExecuteTemplateでは1つのデータしか渡すことができないので、より多くの構造体を配列に追加すると、ちょっと混乱してしまいました。したがって、私がやっていることは構造体の配列を渡すことです別の構造体またはオブジェクトを呼び出す場合は、3つの範囲が必要ですか?説明するのは難しいですが、上記の更新を加え、私のプロジェクトを追加して、より広い視野を持つことができます。 – Martin

関連する問題