-
Notifications
You must be signed in to change notification settings - Fork 67
Expand file tree
/
Copy pathmvp.html
More file actions
124 lines (107 loc) · 3.17 KB
/
Copy pathmvp.html
File metadata and controls
124 lines (107 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MVP Pattern Example</title>
<style>
.photo-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.photo {
width: 300px;
border: 1px solid #ccc;
padding: 10px;
box-sizing: border-box;
position: relative;
}
.photo img {
width: 100%;
height: auto;
}
.caption {
font-size: 18px;
font-weight: bold;
margin: 10px 0;
}
</style>
</head>
<body>
<h1>MVP Pattern Example</h1>
<div id="photoGallery" class="photo-container"></div>
<script>
// Model
class Photo {
constructor(caption, src) {
this.caption = caption;
this.src = src;
}
getCaption() {
return this.caption;
}
getSrc() {
return this.src;
}
}
// View
class PhotoView {
constructor() {
this.photoEl = document.createElement('div');
this.photoEl.classList.add('photo');
}
setCaption(caption) {
this.caption = caption;
}
setSrc(src) {
this.src = src;
}
render() {
this.photoEl.innerHTML = `
<img src="${this.src}" alt="${this.caption}">
<div class="caption">${this.caption}</div>
`;
}
getElement() {
return this.photoEl;
}
}
// Presenter
class PhotoPresenter {
constructor(photoModel, photoView) {
this.photoModel = photoModel;
this.photoView = photoView;
}
render() {
this.photoView.setCaption(this.photoModel.getCaption());
this.photoView.setSrc(this.photoModel.getSrc());
this.photoView.render();
return this.photoView.getElement();
}
}
// Application
const photoData = [
{
caption: 'Sample Photo 1',
src: 'https://via.placeholder.com/300x200?text=Sample+Photo+1',
},
{
caption: 'Sample Photo 2',
src: 'https://via.placeholder.com/300x200?text=Sample+Photo+2',
},
{
caption: 'Sample Photo 3',
src: 'https://via.placeholder.com/300x200?text=Sample+Photo+3',
},
];
const photoGallery = document.getElementById('photoGallery');
photoData.forEach((data) => {
const photoModel = new Photo(data.caption, data.src);
const photoView = new PhotoView();
const photoPresenter = new PhotoPresenter(photoModel, photoView);
photoGallery.appendChild(photoPresenter.render());
});
</script>
</body>
</html>