diff --git a/kernel/av/av.go b/kernel/av/av.go index 6047ab917..21874e1ac 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -42,6 +42,8 @@ type AttributeView struct { KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序 ViewID string `json:"viewID"` // 当前视图 ID Views []*View `json:"views"` // 视图 + + RenderedViewables map[string]Viewable `json:"-"` // 已经渲染好的视图 } // KeyValues 描述了属性视图属性键值列表的结构。 @@ -428,7 +430,7 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) { return } - ret = &AttributeView{} + ret = &AttributeView{RenderedViewables: map[string]Viewable{}} if err = gulu.JSON.UnmarshalJSON(data, ret); err != nil { if strings.Contains(err.Error(), ".relation.contents of type av.Value") { mapAv := map[string]interface{}{} diff --git a/kernel/sql/av.go b/kernel/sql/av.go index 782882123..bb348bc02 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -74,11 +74,12 @@ func RenderView(attrView *av.AttributeView, view *av.View, query string) (ret av renderedAttrViews := map[string]*av.AttributeView{} renderedAttrViews[attrView.ID] = attrView ret = renderView(attrView, view, query, &depth, renderedAttrViews) + + attrView.RenderedViewables[ret.GetID()] = ret return } -func renderView(attrView *av.AttributeView, view *av.View, query string, - depth *int, cachedAttrViews map[string]*av.AttributeView) (ret av.Viewable) { +func renderView(attrView *av.AttributeView, view *av.View, query string, depth *int, cachedAttrViews map[string]*av.AttributeView) (ret av.Viewable) { if 7 < *depth { return } @@ -334,9 +335,7 @@ func fillAttributeViewBaseValue(baseValue *av.BaseValue, fieldID, itemID string, } } -func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection av.Collection, ials map[string]map[string]string, - depth *int, cachedAttrViews map[string]*av.AttributeView) { - +func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection av.Collection, ials map[string]map[string]string, depth *int, cachedAttrViews map[string]*av.AttributeView) { // 先渲染主键、创建时间、更新时间 for _, item := range collection.GetItems() { diff --git a/kernel/sql/av_gallery.go b/kernel/sql/av_gallery.go index f7d1deffd..5fd4550c5 100644 --- a/kernel/sql/av_gallery.go +++ b/kernel/sql/av_gallery.go @@ -18,8 +18,13 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) -func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query string, - depth *int, cachedAttrViews map[string]*av.AttributeView) (ret *av.Gallery) { +func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query string, depth *int, cachedAttrViews map[string]*av.AttributeView) (ret *av.Gallery) { + viewable := attrView.RenderedViewables[view.ID] + if nil != viewable { + ret = viewable.(*av.Gallery) + return + } + ret = &av.Gallery{ BaseInstance: av.NewViewBaseInstance(view), CoverFrom: view.Gallery.CoverFrom, diff --git a/kernel/sql/av_table.go b/kernel/sql/av_table.go index db665e310..545b7bbcb 100644 --- a/kernel/sql/av_table.go +++ b/kernel/sql/av_table.go @@ -22,8 +22,13 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) -func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string, - depth *int, cachedAttrViews map[string]*av.AttributeView) (ret *av.Table) { +func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string, depth *int, cachedAttrViews map[string]*av.AttributeView) (ret *av.Table) { + viewable := attrView.RenderedViewables[view.ID] + if nil != viewable { + ret = viewable.(*av.Table) + return + } + ret = &av.Table{ BaseInstance: av.NewViewBaseInstance(view), Columns: []*av.TableColumn{},