Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
alon@wen
echarts
提交
a07029fc
E
echarts
项目概览
alon@wen
/
echarts
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
echarts
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a07029fc
编写于
8月 31, 2015
作者:
P
pah100
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enhance dependency implementation
上级
25913cb1
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
217 addition
and
58 deletion
+217
-58
src/component/dataZoom/dataZoomProcessor.js
src/component/dataZoom/dataZoomProcessor.js
+86
-0
src/component/dataZoom/helper.js
src/component/dataZoom/helper.js
+52
-0
src/model/Component.js
src/model/Component.js
+44
-33
test/ut/spec/model/Component.js
test/ut/spec/model/Component.js
+35
-25
未找到文件。
src/component/dataZoom/dataZoomProcessor.js
0 → 100644
浏览文件 @
a07029fc
/**
* @file Data zoom processor
*/
define
(
function
(
require
)
{
var
echarts
=
require
(
'
../../echarts
'
);
var
helper
=
require
(
'
./helper
'
);
var
zrUtil
=
require
(
'
zrender/core/util
'
);
echarts
.
registerProcessor
(
function
(
ecModel
)
{
ecModel
.
eachComponent
(
'
dataZoom
'
,
zrUtil
.
curry
(
processSingleDataZoom
,
ecModel
));
});
// FIXME
// originalData是放在原来的data中(这样不会被接下来的processor处理)
// 还是新创建个series(type="dataZoom")专门存originalData(这样会被processor处理,但是一些地方得特别判断type=='dataZoom')
// 同样,Axis的originalData放在哪里。
// 其中:
// originalData在ec2中的用途:
// (1)画dataZoom组件(包括具体数值)
// (2)在packData时会用getRealDataIndex
// TODO
// undo redo
function
processSingleDataZoom
(
ecModel
,
dataZoomModel
)
{
helper
.
eachAxisDim
(
function
(
dimNames
)
{
zrUtil
.
each
(
dataZoomModel
.
get
(
dimNames
.
axisIndex
),
zrUtil
.
curry
(
processSingleAxis
,
ecModel
,
dataZoomModel
,
dimNames
)
);
});
}
function
processSingleAxis
(
ecModel
,
dataZoomModel
,
dimNames
,
axisIndex
)
{
// TODO
// backup axis data
var
axisModel
=
ecModel
.
getComponent
(
dimNames
.
axis
,
axisIndex
);
var
axisData
=
axisModel
.
get
(
'
data
'
);
if
(
axisData
)
{
var
dataLength
=
axisData
.
length
;
var
start
=
Math
.
floor
(
axisModel
.
get
(
'
dataZoomStart
'
)
/
100
*
dataLength
);
var
end
=
Math
.
ceil
(
axisModel
.
get
(
'
dataZoomEnd
'
)
/
100
*
dataLength
);
// Only category axis has property 'data's.
axisData
=
axisData
.
slice
(
start
,
end
);
var
seriesModels
=
getTargetSeriesModelsByAxis
(
ecModel
,
dataZoomModel
,
axisIndex
,
dimNames
);
zrUtil
.
each
(
seriesModels
,
function
(
seriesModel
)
{
// FIXME
// data的backup
// FIXME
// 如何filter,
// 是根据data自己存的信息(如dimension)来判断(这比较直接,但是现在list里存的信息没清楚),
// 还是根据axis type来判断(比较枚举不太好)
// var axisType = axisModel.get('type');
// FIXME
// 这里仅仅处理了list类型
var
seriesData
=
seriesModel
.
getData
();
seriesModel
.
setData
(
seriesData
[
'
filter
'
+
dimNames
.
dim
.
toUpperCase
()](
start
,
end
)
);
// FIXME
// 对于数值轴,还要考虑log等情况
// FIXME
// 对于时间河流图,还要考虑是否须整块移除。
});
}
}
function
getTargetSeriesModelsByAxis
(
ecModel
,
dataZoomModel
,
axisIndex
,
dimNames
)
{
var
seriesModels
=
[];
ecModel
.
eachSeries
(
function
(
seriesModel
)
{
if
(
axisIndex
===
seriesModel
.
get
(
dimNames
.
axisIndex
))
{
seriesModels
.
push
(
seriesModel
);
}
});
return
seriesModels
;
}
});
src/component/dataZoom/helper.js
0 → 100644
浏览文件 @
a07029fc
/**
* @file Data zoom helper
*/
define
(
function
(
require
)
{
var
zrUtil
=
require
(
'
zrender/core/util
'
);
var
helper
=
{};
var
AXIS_DIMS
=
[
'
x
'
,
'
y
'
];
// FIXME
// 公用?
helper
.
eachAxisDim
=
function
(
callback
,
scope
)
{
zrUtil
.
each
(
AXIS_DIMS
,
function
(
axisDim
)
{
var
names
=
{
axisIndex
:
axisDim
+
'
AxisIndex
'
,
axis
:
axisDim
+
'
Axis
'
,
dim
:
axisDim
};
callback
.
call
(
scope
,
names
);
});
};
// FIXME
// 公用?
/**
* If value1 is not null, then return value1, otherwise judget rest of values.
* @param {*...} values
* @return {*} Final value
*/
helper
.
retrieveValue
=
function
(
values
)
{
for
(
var
i
=
0
,
len
=
arguments
.
length
;
i
<
len
;
i
++
)
{
if
(
arguments
[
i
]
!=
null
)
{
return
arguments
[
i
];
}
}
};
// FIXME
// 公用?
/**
* If value is not array, then translate it to array.
* @param {*} value
* @return {Array} [value] or value
*/
helper
.
toArray
=
function
(
value
)
{
return
zrUtil
.
isArray
(
value
)
?
value
:
(
value
==
null
?
[]
:
[
value
]);
};
return
helper
;
});
\ No newline at end of file
src/model/Component.js
浏览文件 @
a07029fc
...
...
@@ -44,10 +44,9 @@ define(function(require) {
});
ComponentModel
.
extend
=
function
(
opts
)
{
var
SubComponentModel
=
Model
.
extend
.
call
(
this
,
opts
);
var
componentType
=
opts
.
type
;
if
(
componentType
)
{
if
(
componentModelClasses
[
componentType
])
{
throw
new
Error
(
'
Component model "
'
+
componentType
+
'
" exists.
'
);
...
...
@@ -57,9 +56,9 @@ define(function(require) {
return
SubComponentModel
;
};
ComponentModel
.
create
=
function
(
name
,
option
,
ecModel
)
{
ComponentModel
.
create
=
function
(
name
,
option
,
ecModel
,
dependentModels
)
{
if
(
componentModelClasses
[
name
])
{
return
new
componentModelClasses
[
name
](
option
,
null
,
ecModel
);
return
new
componentModelClasses
[
name
](
option
,
null
,
ecModel
,
dependentModels
);
}
};
...
...
@@ -69,25 +68,20 @@ define(function(require) {
/**
* Topological travel on Activity Network (Activity On Vertices).
* Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
* If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
*
* @public
* @param {Array.<string>} componentTypeList Target Component type list.
* @param {Function} callback Params: componentType, depends.
* @param {Function} callback Params: componentType, depend
encie
s.
*/
ComponentModel
.
topologicalTavel
=
function
(
componentTypeList
,
callback
,
scope
)
{
ComponentModel
.
topologicalT
r
avel
=
function
(
componentTypeList
,
callback
,
scope
)
{
if
(
!
componentTypeList
.
length
)
{
return
;
}
var
dependencyGraph
=
makeDepndencyGraph
(
componentTypeList
);
var
stack
=
[];
var
entryCount
=
[];
zrUtil
.
each
(
componentTypeList
,
function
(
componentType
)
{
entryCount
[
componentType
]
=
dependencyGraph
[
componentType
].
predecessor
.
length
;
if
(
entryCount
[
componentType
]
===
0
)
{
stack
.
push
(
componentType
);
}
});
var
result
=
makeDepndencyGraph
(
componentTypeList
);
var
graph
=
result
.
graph
;
var
stack
=
result
.
noEntryList
;
if
(
!
stack
.
length
)
{
throw
new
Error
(
'
Circle exists in dependency graph.
'
);
...
...
@@ -95,14 +89,14 @@ define(function(require) {
while
(
stack
.
length
)
{
var
currComponentType
=
stack
.
pop
();
var
currVertex
=
dependencyG
raph
[
currComponentType
];
callback
.
call
(
scope
,
currComponentType
,
currVertex
.
predecessor
.
slice
());
var
currVertex
=
g
raph
[
currComponentType
];
callback
.
call
(
scope
,
currComponentType
,
currVertex
.
originalDeps
.
slice
());
zrUtil
.
each
(
currVertex
.
successor
,
removeEdge
);
}
function
removeEdge
(
succComponentType
)
{
entryCount
[
succComponentType
]
--
;
if
(
entryCount
[
succComponentType
]
===
0
)
{
graph
[
succComponentType
].
entryCount
--
;
if
(
graph
[
succComponentType
].
entryCount
===
0
)
{
stack
.
push
(
succComponentType
);
}
}
...
...
@@ -112,37 +106,54 @@ define(function(require) {
* DepndencyGraph: {Object}
* key: conponentType,
* value: {
* predecessor: [conponentTypes...]
* successor: [conponentTypes...]
* successor: [conponentTypes...],
* originalDeps: [conponentTypes...],
* entryCount: {number}
* }
*/
function
makeDepndencyGraph
(
componentTypeList
)
{
var
dependencyGraph
=
{};
var
graph
=
{};
var
noEntryList
=
[];
zrUtil
.
each
(
componentTypeList
,
function
(
componentType
)
{
var
thisItem
=
createDependencyGraphItem
(
dependencyGraph
,
componentType
);
var
ModelClass
=
componentModelClasses
[
componentType
];
var
depends
=
ModelClass
.
prototype
.
depends
||
[];
zrUtil
.
each
(
depends
,
function
(
depComponentType
)
{
var
thisItem
=
createDependencyGraphItem
(
graph
,
componentType
);
var
originalDeps
=
thisItem
.
originalDeps
=
(
componentModelClasses
[
componentType
].
prototype
.
dependencies
||
[]).
slice
();
var
availableDeps
=
getAvailableDependencies
(
originalDeps
,
componentTypeList
);
thisItem
.
entryCount
=
availableDeps
.
length
;
if
(
thisItem
.
entryCount
===
0
)
{
noEntryList
.
push
(
componentType
);
}
zrUtil
.
each
(
availableDeps
,
function
(
depComponentType
)
{
if
(
zrUtil
.
indexOf
(
thisItem
.
predecessor
,
depComponentType
)
<
0
)
{
thisItem
.
predecessor
.
push
(
depComponentType
);
}
var
thatItem
=
createDependencyGraphItem
(
dependencyG
raph
,
depComponentType
);
var
thatItem
=
createDependencyGraphItem
(
g
raph
,
depComponentType
);
if
(
zrUtil
.
indexOf
(
thatItem
.
successor
,
depComponentType
)
<
0
)
{
thatItem
.
successor
.
push
(
componentType
);
}
});
});
return
dependencyGraph
;
return
{
graph
:
graph
,
noEntryList
:
noEntryList
}
;
}
function
createDependencyGraphItem
(
dependencyG
raph
,
componentType
)
{
if
(
!
dependencyG
raph
[
componentType
])
{
dependencyG
raph
[
componentType
]
=
{
predecessor
:
[],
successor
:
[]};
function
createDependencyGraphItem
(
g
raph
,
componentType
)
{
if
(
!
g
raph
[
componentType
])
{
g
raph
[
componentType
]
=
{
predecessor
:
[],
successor
:
[]};
}
return
dependencyGraph
[
componentType
];
return
graph
[
componentType
];
}
function
getAvailableDependencies
(
originalDeps
,
componentTypeList
)
{
var
availableDeps
=
[];
zrUtil
.
each
(
originalDeps
,
function
(
dep
)
{
zrUtil
.
indexOf
(
componentTypeList
,
dep
)
>=
0
&&
availableDeps
.
push
(
dep
);
});
return
availableDeps
;
}
return
ComponentModel
;
...
...
test/ut/spec/model/Component.js
浏览文件 @
a07029fc
...
...
@@ -19,23 +19,33 @@ describe('Component', function() {
function
xtestCase
()
{}
// jshint ignore:line
testCase
(
'
topologicalTavel_base
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
m1
'
,
depends
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depend
encie
s
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a1
'
});
ComponentModel
.
extend
({
type
:
'
a2
'
});
var
result
=
[];
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a1
'
,
'
a2
'
],
function
(
componentType
,
depends
)
{
result
.
push
([
componentType
,
depends
]);
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a1
'
,
'
a2
'
],
function
(
componentType
,
depend
encie
s
)
{
result
.
push
([
componentType
,
depend
encie
s
]);
});
expect
(
result
).
toEqual
([[
'
a2
'
,
[]],
[
'
a1
'
,
[]],
[
'
m1
'
,
[
'
a1
'
,
'
a2
'
]]]);
});
testCase
(
'
topologicalTavel_a1IsAbsent
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
m1
'
,
dependencies
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a2
'
});
var
result
=
[];
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a2
'
],
function
(
componentType
,
dependencies
)
{
result
.
push
([
componentType
,
dependencies
]);
});
expect
(
result
).
toEqual
([[
'
a2
'
,
[]],
[
'
m1
'
,
[
'
a1
'
,
'
a2
'
]]]);
});
testCase
(
'
topologicalTavel_empty
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
m1
'
,
depends
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depend
encie
s
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a1
'
});
ComponentModel
.
extend
({
type
:
'
a2
'
});
var
result
=
[];
ComponentModel
.
topologicalTavel
([],
function
(
componentType
,
depends
)
{
result
.
push
([
componentType
,
depends
]);
ComponentModel
.
topologicalTavel
([],
function
(
componentType
,
depend
encie
s
)
{
result
.
push
([
componentType
,
depend
encie
s
]);
});
expect
(
result
).
toEqual
([]);
});
...
...
@@ -43,50 +53,50 @@ describe('Component', function() {
testCase
(
'
topologicalTavel_isolate
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
a2
'
});
ComponentModel
.
extend
({
type
:
'
a1
'
});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depends
:
[
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depend
encie
s
:
[
'
a2
'
]});
var
result
=
[];
ComponentModel
.
topologicalTavel
([
'
a1
'
,
'
a2
'
,
'
m1
'
],
function
(
componentType
,
depends
)
{
result
.
push
([
componentType
,
depends
]);
ComponentModel
.
topologicalTavel
([
'
a1
'
,
'
a2
'
,
'
m1
'
],
function
(
componentType
,
depend
encie
s
)
{
result
.
push
([
componentType
,
depend
encie
s
]);
});
expect
(
result
).
toEqual
([[
'
a2
'
,
[]],
[
'
m1
'
,
[
'
a2
'
]],
[
'
a1
'
,
[]]]);
});
testCase
(
'
topologicalTavel_diamond
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
a1
'
,
depends
:
[]});
ComponentModel
.
extend
({
type
:
'
a2
'
,
depends
:
[
'
a1
'
]});
ComponentModel
.
extend
({
type
:
'
a3
'
,
depends
:
[
'
a1
'
]});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depends
:
[
'
a2
'
,
'
a3
'
]});
ComponentModel
.
extend
({
type
:
'
a1
'
,
depend
encie
s
:
[]});
ComponentModel
.
extend
({
type
:
'
a2
'
,
depend
encie
s
:
[
'
a1
'
]});
ComponentModel
.
extend
({
type
:
'
a3
'
,
depend
encie
s
:
[
'
a1
'
]});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depend
encie
s
:
[
'
a2
'
,
'
a3
'
]});
var
result
=
[];
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a1
'
,
'
a2
'
,
'
a3
'
],
function
(
componentType
,
depends
)
{
result
.
push
([
componentType
,
depends
]);
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a1
'
,
'
a2
'
,
'
a3
'
],
function
(
componentType
,
depend
encie
s
)
{
result
.
push
([
componentType
,
depend
encie
s
]);
});
expect
(
result
).
toEqual
([[
'
a1
'
,
[]],
[
'
a3
'
,
[
'
a1
'
]],
[
'
a2
'
,
[
'
a1
'
]],
[
'
m1
'
,
[
'
a2
'
,
'
a3
'
]]]);
});
testCase
(
'
topologicalTavel_loop
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
m1
'
,
depends
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
m2
'
,
depends
:
[
'
m1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a1
'
,
depends
:
[
'
m2
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
m1
'
,
depend
encie
s
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
m2
'
,
depend
encie
s
:
[
'
m1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a1
'
,
depend
encie
s
:
[
'
m2
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a2
'
});
expect
(
function
()
{
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
m2
'
,
'
a1
'
]);
}).
toThrowError
(
/Circl/
);
});
testCase
(
'
topologicalTavel_
r
e
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
m1
'
,
depends
:
[
'
a1
'
,
'
a2
'
]});
testCase
(
'
topologicalTavel_
multipleEchartsInstanc
e
'
,
function
(
ComponentModel
)
{
ComponentModel
.
extend
({
type
:
'
m1
'
,
depend
encie
s
:
[
'
a1
'
,
'
a2
'
]});
ComponentModel
.
extend
({
type
:
'
a1
'
});
ComponentModel
.
extend
({
type
:
'
a2
'
});
var
result
=
[];
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a1
'
,
'
a2
'
],
function
(
componentType
,
depends
)
{
result
.
push
([
componentType
,
depends
]);
ComponentModel
.
topologicalTavel
([
'
m1
'
,
'
a1
'
,
'
a2
'
],
function
(
componentType
,
depend
encie
s
)
{
result
.
push
([
componentType
,
depend
encie
s
]);
});
expect
(
result
).
toEqual
([[
'
a2
'
,
[]],
[
'
a1
'
,
[]],
[
'
m1
'
,
[
'
a1
'
,
'
a2
'
]]]);
result
=
[];
ComponentModel
.
extend
({
type
:
'
m2
'
,
depends
:
[
'
a1
'
,
'
m1
'
]});
ComponentModel
.
topologicalTavel
([
'
m2
'
,
'
m1
'
,
'
a1
'
,
'
a2
'
],
function
(
componentType
,
depends
)
{
result
.
push
([
componentType
,
depends
]);
ComponentModel
.
extend
({
type
:
'
m2
'
,
depend
encie
s
:
[
'
a1
'
,
'
m1
'
]});
ComponentModel
.
topologicalTavel
([
'
m2
'
,
'
m1
'
,
'
a1
'
,
'
a2
'
],
function
(
componentType
,
depend
encie
s
)
{
result
.
push
([
componentType
,
depend
encie
s
]);
});
expect
(
result
).
toEqual
([[
'
a2
'
,
[]],
[
'
a1
'
,
[]],
[
'
m1
'
,
[
'
a1
'
,
'
a2
'
]],
[
'
m2
'
,
[
'
a1
'
,
'
m1
'
]]]);
});
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录