最大存储的monitor数目:50
|
|
使用 CookieInOne
存储已经打开的taskObj(大小有限,大概4K)
使用 LocalStorageInOne
存储已经打开的taskObj(IE8+,大小可达5M)
使用 LocalStorageInOne
存储当前页面的布局“快照”
需要浏览器打开cookie和localStoarge,并且浏览器设置为”退出不清理数据”
基于“快照”的页面布局存储
需求:
保留页面关闭前的打开monitor,保留其布局位置,不管任务是否删除,其占位都应该存在。
快照内容:
- Wall: freeWall添加的style和布局状态
- Brick: freeWall添加的style和布局状态,其他内容是空壳,在页面载入后重新填充菜单、canvas等
- monitorStatus: 各个monitor的图形大小和图形类型
用于再次进入页面后更新默认monitor菜单
快照收集函数
collectDashboardWallDiv
调用- 页面响应式布局的回调
onComplete
- monitor删除的回调
registerDeleteTaskMonitorCallback
应对所有monitor删除后没有brick,页面不会回调onComplete
的情况
- 页面响应式布局的回调
快照释放
进入页面时
不要使用
outerHTML
,outerHTML
替换#dashboardwall
的HTML文本,会返回一个新的DOM对象,使得依靠#dashboardwall
初始化的freeWall
只能在所有快照替换后才能初始化,正常情况下freeWall
可以独立初始化
12345678function releaseDashboardwall() {var dashboardWallDiv = dashboardWallCookie.getItemArray()[0];if (dashboardWallDiv) {var dashboardWall = $('#dashboardwall');var sotred = $(dashboardWallDiv);dashboardWall[0].innerHTML = sotred[0].innerHTML; // 不要使用 outerHTML}}defaultMonitorStatus
从浏览器存储中获取各个monitor的默认菜单,在addTaskMonitor
中填充菜单
基于 freeWall的页面响应式布局
-
特性
- 可拖拽
- 响应式布局
- 多种布局风格等等
-
文档没提但是重要
freeWall会在brick中修改style和添加data-* 的标识,例如:
data-position
,data-handle
等,用于标识brick的状态。brick用户不能设置
id
,因为freeWall会给brick添加id属性,覆盖用户的设置。拖拽产生的布局优先级最高,brick拖拽后所在坐标位置,不会受
fitWidht
fitHeight
fillHoles
等布局变化的影响,需要通过清除brick的data-position
来去除拖拽布局的优先级draggable的handle设置方法:brick的
data-handle="xxx"
,xxx
为CSS选择器字段
需求: monitor添加,删除,大小变化,拖拽
实现方案:
- Brick Default Size:300px - 300px
300大小是最合适的,再小的话图形太小,再大的话窗口宽度X3可能会不够铺开,然后Brick被收缩为0,Chart绘制抛出异常
1234567.dashboardbrick{...width: 300px;height: 300px;...}Browser Width: 至少 1024px
因为每个brick的大小为300px,保证Brick宽度可以X3freeWall配置参数
draggabel:true
,允许拖动。cellW
cellH
设置brick适配的单位长度,为300,则brick宽度为300,600,900等。最好设置与brick默认大小一致,设置太小会导致brick覆盖。fixSize
必须指定,并为0。为0时brick无法改变宽高比例,但是可以改变大小适应窗口。onComplete
调用freeWall.fillHoles();
,对删除brick后留下的空间进行填补。
12345678910111213141516171819freeWall.reset({draggable: true,// selector: '.dashboardbrick',// animate: true,cache: true,cellW: defaultMonitorWidth,cellH: defalutMonitorHeight,delay: 0,fixSize: 0,gutterX: 15,gutterY: 15,onResize: function() {freeWall.refresh();},onComplete: function() {freeWall.fillHoles();collectDashboardWallDiv();}});拖拽设置
- 不使用brick整个可响应拖拽,因为会freeWall会终止点击事件传递,使得图形设置菜单的popup管理无法处理(依赖
document.click
); - 设置
data-handle=".monitortitletext"
,使用monitor标题作为拖动handle
- 不使用brick整个可响应拖拽,因为会freeWall会终止点击事件传递,使得图形设置菜单的popup管理无法处理(依赖
- Brick Default Size:300px - 300px
Brick大小变化
在
registerChangeMonitorSizeCallback
中处理12345freeWall.fixSize({block: element,width: newWidth,height: newHeight});使用
freeWall.fixPos()
去除拖拽后的位置优先级,使得可以在图形变化后布局到合适位置
例如:如果brick是一行中最后一个,宽度X2后,如果不freeWall.fixPos(),该brick会直接在原来位置宽度X2,页面宽度超过窗口宽度,页面宽会变成scroll123freeWall.fixPos({block: element});Brick宽度X3操作需要窗口有较大的宽度
onResize
事件假设用户不会做
resize
的操作再测试
看坑
freeWall的CSS
padding
对于brick无效,brick都是position:absolute
,请使用margin
outerHTML
或返回新的DOM对象,参考Element.outerHTMLReplaces the element with the nodes generated by parsing the string content with the parent of element as the context node for the fragment parsing algorithm.
扩展
对freeWall源码做了修改:
拓展
freeWall.fixPos()
方法,不带top
或left
参数时候,删除brick的位置属性data-position
123freeWall.fixPos({block: element});setDraggable
,移除旧的handle
绑定,然后设置新的handle
绑定。