WorkFlow项目(二)
2019-04-17 本文已影响0人
敬亭阁主
今天研究了一下组件的组合问题,即一个组件内可以包含多个组件,平常显示为一个组件,需要修改可展开为多组件模式,如下图。
收缩模式 展开模式两种模式之间的切换通过双击组件来实现。
paper.on({
'cell:pointerdblclick': function(cellView) {
var isElement = cellView.model.isElement();
var type = cellView.model.prop('type');
if (isElement && type == 'devs.GroupAtomic') {
expendGraph(cellView.model);
} else if (isElement && type == 'devs.Coupled') {
collapseGraph(cellView.model);
}
}
});
同时还需要限制子cell不能移出父cell的边界。
restrictTranslate: function(elementView) {
var parentId = elementView.model.get('parent');
return parentId && this.model.getCell(parentId).getBBox();
},
Joint缺省的动作是当子cell(atomic)移动到父cell(Coupled)边界内时,自动执行embed操作,而当子cell移出父cell边界时执行unembed操作。但实际上,validateEmbedding
函数控制了是否要执行embed操作,而只要一移动子cell,立即执行unembed操作,并不是在移出边界时才执行。
我目前的想法是已经在父cell内的子cell不允许移出来,这个由restrictTranslate
来控制。同时不允许外部的cell移动到父cell内,这个就比较困难了,因为如果在validateEmbedding
函数内判断,是无法用model.get('parent')
来判断这个cell是否属于该父cell(因为此时已经执行过unembed操作了)。
最后我的解决办法就是在子cell的属性中多加一个pid,当自动进行unembed时只是删除了parent属性,而我添加的pid属性还存在,就可以在validate中进行判断了。
//add extra prop
c1.embed(a1);
a1.attr({pid: c1.id});
//judge logic
validateEmbedding: function(childView, parentView) {
if (parentView.model instanceof joint.shapes.devs.Coupled) {
return childView.model.attr('pid') == parentView.model.id;
}
return false;
},
但是这个实现比较麻烦,属于非标操作,以后看看有没有更好地解决方案吧。