我评估OPA创建实时协作电子表格(来源: https://github.com/omarbenhamid/Cloudsheet/blob/master/cloudsheet.opa)
我希望人们在电子表格上实时练习,我想为每个电子表格创建一个Network.cloud,以便向查看电子表格的所有用户传达更新。
每个单元格都是<input type="text" onkeypress={event->keyboard_update(event,sheetname,row,column)}/>
当调用keyboard_update
时,我想在电子表格的云上广播一条消息,以便其他观看者得到更新。但这是我的问题:
keyboard_update(event,sheetname,row,column) = (
Network.broadcast({/*my update notif message*/}, Network.cloud(sheetname))
)
就像在每次调用时创建的新网络一样,即使是Network.cloud的API文档也说:
“当一个或多个服务器使用相同的值k调用Network.cloud(k)时,实际上只创建了一个网络”
我找到的唯一解决方案是将我的云编入一个关联列表中,该列表存储在一个全局可变项中:
clouds = Mutable.make([] : list((string,Network.network(message))))
使用List.assoc获取我的云,并在必要时最终将其添加到索引中(请参阅源代码中的函数getcloud)。
为什么我第一次使用Network.cloud(sheetname)作为Network.broadcast参数的行为是错误的?
答案 0 :(得分:0)
我认为你不应该为每个细胞创建一个新的云。 您应该为整个文档或webapp创建一个云,并发送不同类型的消息:
例如:
type cloud_message = {
sheet_name : string
row : int
col : int
content : string
}
然后,只在顶层创建一次云:
@publish my_cloud = Network.cloud("my_cloud") : Network.network(cloud_message)
最后,在您的keyboard_update中,请致电:
Network.broadcast({sheet_name=... row=... col=... content=...}, my_cloud)