點(diǎn)怎樣約束跳轉(zhuǎn))
數(shù)據(jù)故事工作室里用戶增長(zhǎng)趨勢(shì)、區(qū)域貢獻(xiàn)結(jié)構(gòu)和季度預(yù)測(cè)都已經(jīng)畫(huà)好了。把三張圖按創(chuàng)建順序排列并不一定是一個(gè)故事預(yù)測(cè)頁(yè)可能依賴(lài)前面解釋過(guò)的區(qū)域拆分讀者卻可以直接跳過(guò)去看到結(jié)論卻不知道依據(jù)。我把每一頁(yè)當(dāng)成敘事節(jié)點(diǎn)節(jié)點(diǎn)除了引用圖表還聲明進(jìn)入條件和下一步分支。編輯區(qū)允許調(diào)整順序預(yù)覽區(qū)只沿著合法邊跳轉(zhuǎn)。圖表和敘事節(jié)點(diǎn)不是同一個(gè)對(duì)象exportinterfaceChartAsset{id:stringtitle:stringtype:line|bar|donut|areadataRevision:number}exportinterfaceStoryNode{id:stringchartId:stringheadline:stringbody:stringrequiresNodeIds:string[]nextNodeIds:string[]}exportinterfaceStoryState{currentNodeId:stringvisitedNodeIds:string[]}同一張圖可以被不同節(jié)點(diǎn)引用第一次用于說(shuō)明趨勢(shì)第二次用于和預(yù)測(cè)疊加。節(jié)點(diǎn)擁有文案與關(guān)系圖表只負(fù)責(zé)數(shù)據(jù)表達(dá)。編輯時(shí)先防止關(guān)系成環(huán)如果 A 依賴(lài) B、B 又依賴(lài) A預(yù)覽永遠(yuǎn)找不到起點(diǎn)。新增邊前檢測(cè)目標(biāo)是否已經(jīng)能回到起點(diǎn)。exportfunctionreaches(nodes:StoryNode[],fromId:string,targetId:string):boolean{constvisitednewSetstring()constwalk(id:string):boolean{if(idtargetId)returntrueif(visited.has(id))returnfalsevisited.add(id)constnodenodes.find((item:StoryNode)item.idid)returnnode?node.nextNodeIds.some(walk):false}returnwalk(fromId)}exportfunctioncanLink(nodes:StoryNode[],fromId:string,toId:string):boolean{returnfromId!toId!reaches(nodes,toId,fromId)}編輯器拒絕成環(huán)關(guān)系時(shí)保留用戶當(dāng)前的節(jié)點(diǎn)選擇并提示是哪條邊沖突不把整張故事圖重置。預(yù)覽只進(jìn)入條件滿足的節(jié)點(diǎn)exportfunctioncanEnter(state:StoryState,node:StoryNode):boolean{returnnode.requiresNodeIds.every((id:string)state.visitedNodeIds.includes(id))}exportfunctionmoveTo(state:StoryState,nodes:StoryNode[],nextId:string):StoryState{constnextnodes.find((item:StoryNode)item.idnextId)if(!next||!canEnter(state,next))returnstateconstvisitedstate.visitedNodeIds.includes(nextId)?state.visitedNodeIds:[...state.visitedNodeIds,nextId]return{currentNodeId:nextId,visitedNodeIds:visited}}讀者在預(yù)覽里點(diǎn)擊“查看預(yù)測(cè)”時(shí)若還沒(méi)有經(jīng)過(guò)“區(qū)域貢獻(xiàn)結(jié)構(gòu)”頁(yè)面展示該節(jié)點(diǎn)的摘要入口而不是空白跳轉(zhuǎn)。數(shù)據(jù)更新后標(biāo)記受影響節(jié)點(diǎn)季度預(yù)測(cè)使用的數(shù)據(jù)字段變了引用它的節(jié)點(diǎn)不能繼續(xù)顯示“已確認(rèn)”。節(jié)點(diǎn)記錄圖表版本預(yù)覽前檢查引用版本。exportinterfaceNodeBinding{nodeId:stringchartId:stringchartRevision:number}exportfunctionisStale(binding:NodeBinding,chart:ChartAsset):boolean{returnbinding.chartIdchart.idbinding.chartRevision!chart.dataRevision}數(shù)據(jù)更新后編輯器把受影響節(jié)點(diǎn)標(biāo)為“待復(fù)核”文案不會(huì)被自動(dòng)改寫(xiě)。用戶確認(rèn)新數(shù)據(jù)仍支持原結(jié)論再更新綁定版本。故事結(jié)構(gòu)、圖表關(guān)系和預(yù)覽進(jìn)度分開(kāi)后拖動(dòng)圖表卡片只影響編輯排版不會(huì)把閱讀路徑弄亂。后續(xù)接入真實(shí)數(shù)據(jù)源時(shí)每次更新只需提升dataRevision敘事節(jié)點(diǎn)就能明確指出哪些結(jié)論需要重新檢查。