diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 25391f262..99b0771ca 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1235,7 +1235,7 @@ func getRefDefIDs(node *ast.Node) (refDefIDs []string) { } func upsertAvBlockRel(node *ast.Node) { - var avIDs []string + var affectedAvIDs []string ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering { return ast.WalkContinue @@ -1244,13 +1244,33 @@ func upsertAvBlockRel(node *ast.Node) { if ast.NodeAttributeView == n.Type { avID := n.AttributeViewID if changed := av.UpsertBlockRel(avID, n.ID); changed { - avIDs = append(avIDs, avID) + affectedAvIDs = append(affectedAvIDs, avID) } } return ast.WalkContinue }) - avIDs = gulu.Str.RemoveDuplicatedElem(avIDs) - for _, avID := range avIDs { + + updatedNodes := []*ast.Node{node} + var parents []*ast.Node + for parent := node.Parent; nil != parent && ast.NodeDocument != parent.Type; parent = parent.Parent { + parents = append(parents, parent) + } + updatedNodes = append(updatedNodes, parents...) + for _, updatedNode := range updatedNodes { + ast.Walk(updatedNode, func(n *ast.Node, entering bool) ast.WalkStatus { + avs := n.IALAttr(av.NodeAttrNameAvs) + if "" == avs { + return ast.WalkContinue + } + + avIDs := strings.Split(avs, ",") + affectedAvIDs = append(affectedAvIDs, avIDs...) + return ast.WalkContinue + }) + } + + affectedAvIDs = gulu.Str.RemoveDuplicatedElem(affectedAvIDs) + for _, avID := range affectedAvIDs { ReloadAttrView(avID) } }