Skip to content

Commit 60eb216

Browse files
author
Li Xinyang
committed
add list manipulation content
1 parent fbf65db commit 60eb216

22 files changed

+137
-0
lines changed

chapter3/13_list_manipulation.md

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
## 列表操作
2+
3+
![](../img/L/list_format.png)
4+
5+
列表的常用形式有图片形式与信息形式的,常见的有如下的操作:
6+
7+
- 显示列表
8+
- 选择列表项
9+
- 新增列表项
10+
- 删除列表项
11+
- 更新列表项
12+
13+
### 范例代码
14+
15+
**数据结构**
16+
17+
![](../img/L/list_data_structure.png)
18+
19+
```javascript
20+
[
21+
{
22+
"id": 22341234,
23+
"name": "Good Song",
24+
"album": {
25+
"id": 213512,
26+
"name": "Good Album"
27+
},
28+
"artist":{
29+
"id": 1234512,
30+
"name": "Evil Artist"
31+
}
32+
}
33+
]
34+
```
35+
36+
**显示列表**
37+
38+
*列表容器*
39+
40+
![](../img/L/list_container.png)
41+
42+
*列表模板* 分离数据和视图
43+
44+
![](../img/L/list_template.png)
45+
46+
**绘制列表**
47+
48+
*准备数据并整合模板与数据*
49+
50+
![](../img/L/list_render.png)
51+
52+
*通过 AJAX 获取数据*
53+
54+
![](../img/L/list_ajax_get_data.png)
55+
56+
*列表单选操作*
57+
58+
![](../img/L/list_single_selection.png)
59+
60+
*列表多选操作(Control 与 Shift 操作)*
61+
62+
```javascript
63+
parent.addEventListener(
64+
'mouseup', function(event) {
65+
var target = getTarget(event),
66+
selected = isSelected(target);
67+
// right click
68+
if (event.button == 2&&selected) {
69+
return;
70+
}
71+
// with control click
72+
if (event.ctrlKey) {
73+
!selected?appendToSelection(target):removeFromSelection(target);
74+
}
75+
// with shift key
76+
if (event.shiftKey) {
77+
var list = Array.prototype.slice.call(
78+
parent.getElementsByTagName('li'), 0
79+
);
80+
if (!last) {
81+
last = getLastElection() || target;
82+
}
83+
selectWithRangeFromTo(list, last, target);
84+
} else {
85+
last = null;
86+
}
87+
}
88+
);
89+
```
90+
91+
*右键菜单*
92+
93+
`contextmenu` 事件为右键菜单弹出事件。
94+
95+
![](../img/L/list_right_click.png)
96+
97+
![](../img/L/list_right_click_details.png)
98+
99+
*增加列表*
100+
101+
![](../img/L/list_add_item.png)
102+
103+
![](../img/L/list_add_item_using_template.png)
104+
105+
*删除列表*
106+
107+
![](../img/L/list_item_remove.png)
108+
109+
*更新列表*
110+
111+
![](../img/L/list_update.png)
112+
113+
*更新状态*
114+
115+
![](../img/L/list_update_state.png)
116+
117+
### 编程方式
118+
119+
**面向视图** 的操作方式,即为针对视图的直接编程(对 DOM 树进行直接的操作)。
120+
121+
![](../img/L/list_view_oriented.png)
122+
123+
![](../img/L/list_view_oriented_1.png)
124+
125+
这样的方式代理了许多的弊端,例如无法进行完全的自动化测试以及极高的视图层和控制层耦合的紧密性。
126+
127+
**面向数据** 的操作方式,视图则被抽象为若干的数据以及状态(后续所有的操作都会更加数据模型而操作),从而做到视图模型层完全自动化的测试。
128+
129+
![](../img/L/list_viewmodel_1.png)
130+
131+
![](../img/L/list_viewmodel_2.png)
132+
133+
![](../img/L/list_viewmodel_3.png)
134+
135+
![](../img/L/list_viewmodel_4.png)
136+
137+
![](../img/L/list_viewmodel_5.png)

img/L/list_add_item.png

108 KB
Loading
111 KB
Loading

img/L/list_ajax_get_data.png

153 KB
Loading

img/L/list_container.png

422 KB
Loading

img/L/list_data_structure.png

288 KB
Loading

img/L/list_format.png

471 KB
Loading

img/L/list_item_remove.png

84.6 KB
Loading

img/L/list_render.png

235 KB
Loading

img/L/list_right_click.png

135 KB
Loading

0 commit comments

Comments
 (0)