WEBVTT

1
00:00:01.510 --> 00:00:03.190
<v Instructor>Welcome back</v>

2
00:00:03.190 --> 00:00:05.880
and let's now implement the architecture

3
00:00:05.880 --> 00:00:08.563
that we just discussed in the previous lecture.

4
00:00:10.280 --> 00:00:14.090
And so, let's start by implementing that App class

5
00:00:14.090 --> 00:00:16.560
that I just showed you previously.

6
00:00:16.560 --> 00:00:19.650
And actually, I also have this architecture diagram

7
00:00:19.650 --> 00:00:23.223
right here, and it is this one called part one.

8
00:00:24.450 --> 00:00:26.540
And so as you see, this is exactly

9
00:00:26.540 --> 00:00:29.030
what we just discussed before.

10
00:00:29.030 --> 00:00:32.420
And so I will now go ahead and start to implement

11
00:00:32.420 --> 00:00:35.053
this class here and all of these methods.

12
00:00:36.400 --> 00:00:37.233
All right.

13
00:00:39.410 --> 00:00:41.893
So class App,

14
00:00:43.960 --> 00:00:46.380
and then we need the constructor,

15
00:00:46.380 --> 00:00:48.623
which for now I'm gonna leave empty here.

16
00:00:50.770 --> 00:00:52.663
Then we need getPosition,

17
00:00:57.950 --> 00:00:59.620
Next we need loadMap,

18
00:01:02.390 --> 00:01:04.923
let's take a look at what's next here.

19
00:01:06.060 --> 00:01:08.980
Then we have showForm toggleElevationField,

20
00:01:08.980 --> 00:01:10.230
and newWorkout.

21
00:01:14.560 --> 00:01:16.493
So, showForm,

22
00:01:20.646 --> 00:01:23.913
toggleElevationField,

23
00:01:27.660 --> 00:01:29.980
and finally newWorkout, okay.

24
00:01:34.310 --> 00:01:36.580
And so now, we have this structure

25
00:01:36.580 --> 00:01:39.453
where we can put our code that we already have.

26
00:01:40.430 --> 00:01:42.750
So let's start with this one here.

27
00:01:42.750 --> 00:01:47.010
So getting the user's current position using geolocation

28
00:01:49.120 --> 00:01:51.993
and so I'm gonna start by taking all of this code here.

29
00:01:53.810 --> 00:01:56.993
So, it ends here I believe.

30
00:01:58.870 --> 00:02:01.520
Yap, that's the one, cut it

31
00:02:01.520 --> 00:02:04.113
and put it here into getPosition.

32
00:02:06.800 --> 00:02:10.640
But now I actually want to refactor this a little bit better

33
00:02:10.640 --> 00:02:13.160
because I think it's still a bit messy

34
00:02:13.160 --> 00:02:15.470
to have this callback function here

35
00:02:15.470 --> 00:02:20.243
off to get current position function right here, okay.

36
00:02:21.830 --> 00:02:25.290
And so this function here, so this callback

37
00:02:25.290 --> 00:02:29.430
of getCurrentPosition is gonna become the loadMap.

38
00:02:30.380 --> 00:02:34.860
Okay, because that is exactly what we do here in function.

39
00:02:34.860 --> 00:02:36.140
So let's cut this here

40
00:02:37.200 --> 00:02:39.483
and put it here in loadMap

41
00:02:41.800 --> 00:02:44.350
and actually of course we don't need this function keyword

42
00:02:44.350 --> 00:02:48.993
here because we already called it a loadMap, right?

43
00:02:49.980 --> 00:02:52.770
So let's just copy the parameter name here

44
00:02:53.990 --> 00:02:57.763
and put it here and then get rid of these.

45
00:02:59.830 --> 00:03:01.010
Okay.

46
00:03:01.010 --> 00:03:04.150
And so now here as the first callback function,

47
00:03:04.150 --> 00:03:08.100
which is the one for success, so actually here,

48
00:03:08.100 --> 00:03:09.690
we need to call loadMap.

49
00:03:10.580 --> 00:03:12.853
And so since we're now in a class,

50
00:03:13.870 --> 00:03:16.180
we need to say this.loadMap.

51
00:03:20.100 --> 00:03:22.360
And so in JavaScript, we'll then call

52
00:03:22.360 --> 00:03:24.550
this callback function here and pass

53
00:03:24.550 --> 00:03:28.730
in the position argument, as soon as the current position

54
00:03:28.730 --> 00:03:32.510
of the user is determined, all right?

55
00:03:32.510 --> 00:03:34.800
And so that event that I just mentioned

56
00:03:34.800 --> 00:03:37.700
is basically this receive position.

57
00:03:37.700 --> 00:03:41.110
And as I said, it is not an event in the common sense

58
00:03:41.110 --> 00:03:42.550
that we used before.

59
00:03:42.550 --> 00:03:46.170
So one that we hand using addEventListener,

60
00:03:46.170 --> 00:03:48.853
but we can still think of this as an event.

61
00:03:49.750 --> 00:03:53.320
All right, and so basically on that event,

62
00:03:53.320 --> 00:03:56.473
the, this.loadMap method is called.

63
00:03:58.650 --> 00:04:01.120
Now, here we have some other code,

64
00:04:01.120 --> 00:04:03.830
So to event list notice, but for now,

65
00:04:03.830 --> 00:04:07.270
let's actually make this code here work

66
00:04:07.270 --> 00:04:11.010
because right now of course, none of this will do anything

67
00:04:11.010 --> 00:04:13.490
to our application, will it?

68
00:04:13.490 --> 00:04:15.510
And why is that?

69
00:04:15.510 --> 00:04:18.010
Well, it is because first of all,

70
00:04:18.010 --> 00:04:23.010
we need to create an actual object out of this class, okay?

71
00:04:23.290 --> 00:04:26.000
So right now this is all just a plan.

72
00:04:26.000 --> 00:04:28.130
So like the blueprint of a house,

73
00:04:28.130 --> 00:04:30.950
but it is not the actual house yet

74
00:04:30.950 --> 00:04:34.980
and so that analogy is sometimes very helpful.

75
00:04:34.980 --> 00:04:38.200
So in this case, this is just a theoretical plan

76
00:04:38.200 --> 00:04:42.410
or for application, but it's not a real object yet.

77
00:04:42.410 --> 00:04:44.453
And so let's create that down here.

78
00:04:46.140 --> 00:04:49.920
And so I will again call this app, but lowercase.

79
00:04:49.920 --> 00:04:54.770
And so this app will be new App like this

80
00:04:55.880 --> 00:04:59.820
and this application actually does need any arguments.

81
00:04:59.820 --> 00:05:01.520
And so here in the constructor

82
00:05:01.520 --> 00:05:06.130
we don't have any parameters in this method, okay.

83
00:05:06.130 --> 00:05:08.930
Because right now we don't need any inputs

84
00:05:08.930 --> 00:05:10.580
into our application.

85
00:05:10.580 --> 00:05:13.980
If we need it then, could add that here to the constructor,

86
00:05:13.980 --> 00:05:17.170
but in this case, that's just not necessary.

87
00:05:17.170 --> 00:05:19.700
One example that we could use for inputs

88
00:05:19.700 --> 00:05:22.710
in an application like this would be for example,

89
00:05:22.710 --> 00:05:24.830
an object of options,

90
00:05:24.830 --> 00:05:28.220
which is pretty common in third party libraries.

91
00:05:28.220 --> 00:05:31.280
So if we were building a library for some other people

92
00:05:31.280 --> 00:05:34.810
to use, then we could allow these developers to customize

93
00:05:34.810 --> 00:05:37.440
the library, using some options.

94
00:05:37.440 --> 00:05:42.440
But again does just not necessary in this case, all right?

95
00:05:43.300 --> 00:05:47.600
Now in order to actually trigger the geolocation API,

96
00:05:47.600 --> 00:05:50.860
this method here needs to be called, right?

97
00:05:50.860 --> 00:05:53.403
But right now dad is not happening.

98
00:05:54.340 --> 00:05:56.750
So how can we do that?

99
00:05:56.750 --> 00:05:59.620
We could do this, right?

100
00:05:59.620 --> 00:06:04.620
So app.getPosition and so then this code here

101
00:06:05.550 --> 00:06:07.870
would get executed, right at a point

102
00:06:07.870 --> 00:06:09.820
where the application loads

103
00:06:09.820 --> 00:06:13.007
and that's because as we already know all the code,

104
00:06:13.007 --> 00:06:15.690
that's here in the top level scope.

105
00:06:15.690 --> 00:06:18.210
So out here outside of any function

106
00:06:18.210 --> 00:06:21.860
will get executed immediately as the script loads,

107
00:06:21.860 --> 00:06:22.940
all right?

108
00:06:22.940 --> 00:06:24.190
And so, right in the beginning,

109
00:06:24.190 --> 00:06:27.670
this new app variable here is created out of the class.

110
00:06:27.670 --> 00:06:30.930
And then right now, immediately afterwards,

111
00:06:30.930 --> 00:06:34.020
we would get to the position of the user.

112
00:06:34.020 --> 00:06:37.180
However, why should we do this out here,

113
00:06:37.180 --> 00:06:40.520
if we could simply do it inside of the class?

114
00:06:40.520 --> 00:06:42.523
That would actually be a lot cleaner.

115
00:06:43.460 --> 00:06:46.600
So inside of the class, we also have a method

116
00:06:46.600 --> 00:06:50.200
that automatically gets called as the page loads.

117
00:06:50.200 --> 00:06:52.743
So let's think how we could do this instead.

118
00:06:53.640 --> 00:06:55.920
So inside of the App class,

119
00:06:55.920 --> 00:06:58.730
we also have a method that gets executed

120
00:06:58.730 --> 00:07:03.200
as soon as this app here is created, right?

121
00:07:03.200 --> 00:07:08.060
And that is the constructor method, remember?

122
00:07:08.060 --> 00:07:11.210
So this constructor method is called immediately

123
00:07:11.210 --> 00:07:15.360
when a new object is created from this class

124
00:07:15.360 --> 00:07:17.670
and this object that is created,

125
00:07:17.670 --> 00:07:20.690
so this app object is created right in the beginning

126
00:07:20.690 --> 00:07:22.380
when the page loads down.

127
00:07:22.380 --> 00:07:25.770
So that means that the constructor is also executed

128
00:07:25.770 --> 00:07:27.890
immediately as the page loads.

129
00:07:27.890 --> 00:07:32.090
And so what we can do is to simply getPosition

130
00:07:32.090 --> 00:07:33.263
in the constructor.

131
00:07:36.631 --> 00:07:38.980
And so here, all we have to do is to change it

132
00:07:38.980 --> 00:07:42.720
to the this word, so to the current object

133
00:07:42.720 --> 00:07:44.900
and that's actually it.

134
00:07:44.900 --> 00:07:47.420
So our code should actually already be working

135
00:07:47.420 --> 00:07:49.060
at this point.

136
00:07:49.060 --> 00:07:51.560
So the current position should be determined

137
00:07:51.560 --> 00:07:55.280
here in this method and then the loadMap method

138
00:07:55.280 --> 00:07:59.730
should be called with that current position, right?

139
00:07:59.730 --> 00:08:02.270
And actually that's exactly what we also have here

140
00:08:02.270 --> 00:08:03.413
in our diagram.

141
00:08:04.250 --> 00:08:06.800
So you'll see the load page events will trigger

142
00:08:06.800 --> 00:08:10.420
the constructor, which will then trigger getPosition.

143
00:08:10.420 --> 00:08:12.860
And then as soon as we receive the position,

144
00:08:12.860 --> 00:08:17.450
the loadMap method is called with the position, okay?

145
00:08:17.450 --> 00:08:19.493
And so let's see if that actually works.

146
00:08:20.550 --> 00:08:22.563
So here in our version,

147
00:08:23.420 --> 00:08:25.543
and let's just reload it to manually here,

148
00:08:27.210 --> 00:08:31.820
and here we go, so here is our map again.

149
00:08:31.820 --> 00:08:35.723
So our first part of the refactoring is already working.

150
00:08:36.840 --> 00:08:38.290
So that's great,

151
00:08:38.290 --> 00:08:40.760
but now let's go back to our code here

152
00:08:40.760 --> 00:08:43.733
because we still have some things to fix here.

153
00:08:45.600 --> 00:08:50.600
So remember that right here in the loadMap function,

154
00:08:50.660 --> 00:08:54.050
we have this global variable here called map.

155
00:08:54.050 --> 00:08:55.740
I mean, we don't have here,

156
00:08:55.740 --> 00:08:59.720
we are simply redefining it because it is defined up here

157
00:08:59.720 --> 00:09:01.210
in the global scope.

158
00:09:01.210 --> 00:09:04.300
But now, remember that we actually want everything

159
00:09:04.300 --> 00:09:07.070
that is related to our application.

160
00:09:07.070 --> 00:09:10.463
And that includes the map right in this App class.

161
00:09:11.305 --> 00:09:13.730
And so therefore we're now gonna define the map

162
00:09:13.730 --> 00:09:17.920
and map event as properties of the object.

163
00:09:17.920 --> 00:09:22.370
And for that, let's actually use a private class field.

164
00:09:22.370 --> 00:09:26.470
So remember that works like this and so map,

165
00:09:26.470 --> 00:09:29.020
and now we will not set it to anything.

166
00:09:29.020 --> 00:09:32.773
So just like this, and then the same for the mapEvent.

167
00:09:35.900 --> 00:09:40.350
So both of them will now become private instance properties.

168
00:09:40.350 --> 00:09:42.600
So properties that are gonna be present

169
00:09:42.600 --> 00:09:46.073
on all the instances created through this class.

170
00:09:47.820 --> 00:09:50.950
Now let's keep them here for now, in order to not break

171
00:09:50.950 --> 00:09:52.970
the rest of the application,

172
00:09:52.970 --> 00:09:57.760
but now we need to fix of course, the rest of this code.

173
00:09:57.760 --> 00:09:59.970
So at least this load map method,

174
00:09:59.970 --> 00:10:03.210
because that one relies on map and so therefore

175
00:10:03.210 --> 00:10:05.780
we need to start using it now.

176
00:10:05.780 --> 00:10:09.973
So here we now need to actually use this.map,

177
00:10:11.520 --> 00:10:15.610
because again, this is now like a property that is defined

178
00:10:15.610 --> 00:10:17.340
on the object itself,

179
00:10:17.340 --> 00:10:20.870
it's no longer just a normal variable, right?

180
00:10:20.870 --> 00:10:25.070
And then here the same, this.map

181
00:10:25.070 --> 00:10:29.920
and here also this.map

182
00:10:29.920 --> 00:10:33.350
and then here we need to define the mapEvent.

183
00:10:33.350 --> 00:10:37.903
And so this one, we also called this.#mapEvent.

184
00:10:39.800 --> 00:10:41.493
Now here, this is just wrong,

185
00:10:42.350 --> 00:10:47.350
so let's fix that and all right, that's actually it,

186
00:10:48.010 --> 00:10:51.100
but actually this will not yet work,

187
00:10:51.100 --> 00:10:54.363
but let me show you the error before I actually fix it.

188
00:10:55.620 --> 00:10:58.873
So let's go back here and reload this page again,

189
00:10:59.820 --> 00:11:02.070
and now it should not work.

190
00:11:02.070 --> 00:11:06.633
And so indeed we get, Cannot set property #map of undefined.

191
00:11:07.550 --> 00:11:12.490
So on line 38, so that's right here.

192
00:11:12.490 --> 00:11:16.050
And so if the error message says that we cannot set map

193
00:11:16.050 --> 00:11:17.490
on the this keyword.

194
00:11:17.490 --> 00:11:19.460
It means that something must be wrong

195
00:11:19.460 --> 00:11:22.023
with the this keyword, right?

196
00:11:22.960 --> 00:11:27.360
So let's use our friend console.log to take a look at it

197
00:11:28.370 --> 00:11:31.343
and indeed it is undefined here.

198
00:11:32.920 --> 00:11:34.783
So, why is that?

199
00:11:36.070 --> 00:11:39.800
Well, this loadMap method is actually called

200
00:11:39.800 --> 00:11:42.800
by function here, right?

201
00:11:42.800 --> 00:11:46.880
So that's right here and in fact this is actually treated

202
00:11:46.880 --> 00:11:51.210
as a regular function call, not as a method call.

203
00:11:51.210 --> 00:11:54.140
So again, since this is a callback function,

204
00:11:54.140 --> 00:11:56.390
we are not calling it ourselves.

205
00:11:56.390 --> 00:11:59.430
It is to getCurrentPosition function that we'll call

206
00:11:59.430 --> 00:12:01.890
this callback function once that it gets

207
00:12:01.890 --> 00:12:04.280
the current position of the user.

208
00:12:04.280 --> 00:12:08.370
And when it calls this method, so this function here,

209
00:12:08.370 --> 00:12:11.500
then it does so, as a regular function call.

210
00:12:11.500 --> 00:12:14.760
And as we learned before in a regular function call,

211
00:12:14.760 --> 00:12:18.020
the this keyword is set to undefined.

212
00:12:18.020 --> 00:12:21.973
And so that's why in here that this keyword is undefined.

213
00:12:23.010 --> 00:12:26.480
But fortunately for us, there is a good solution

214
00:12:26.480 --> 00:12:28.640
that we already know about.

215
00:12:28.640 --> 00:12:32.530
And that solution is to manually bind the this keyword

216
00:12:32.530 --> 00:12:34.450
to whatever we need.

217
00:12:34.450 --> 00:12:36.923
And in this case, that is simply this.

218
00:12:38.200 --> 00:12:41.793
So right here, this points to the current object.

219
00:12:42.770 --> 00:12:43.603
All right?

220
00:12:43.603 --> 00:12:45.340
And so that's exactly the this keyword

221
00:12:45.340 --> 00:12:48.700
that we also want inside of loadMap.

222
00:12:48.700 --> 00:12:53.700
And so here we explicitly say that, okay?

223
00:12:53.820 --> 00:12:57.890
And remember that binds will simply return a new function

224
00:12:57.890 --> 00:13:01.240
and so all of this here is still a function that JavaScript

225
00:13:01.240 --> 00:13:03.963
can then call whenever it needs to.

226
00:13:05.440 --> 00:13:09.936
So that should now work and so if we go back here,

227
00:13:09.936 --> 00:13:14.290
then our maps should still work as it should.

228
00:13:14.290 --> 00:13:17.633
And indeed, now we get the this keyword here.

229
00:13:18.830 --> 00:13:21.780
So we have the map and we have the mapEvent

230
00:13:21.780 --> 00:13:26.023
and we already see that or map is this big object here

231
00:13:26.023 --> 00:13:29.110
that is coming from the leaflet library.

232
00:13:29.110 --> 00:13:29.943
Now, all right.

233
00:13:30.860 --> 00:13:33.550
So that was the most important thing

234
00:13:33.550 --> 00:13:36.680
and the biggest thing we had to refactor,

235
00:13:36.680 --> 00:13:40.850
but now let's quickly also talk about these two event

236
00:13:40.850 --> 00:13:42.773
listeners that we have down here.

237
00:13:43.860 --> 00:13:48.550
So the one listening for the event of submitting the form

238
00:13:48.550 --> 00:13:52.213
and to one of toggling the input type field.

239
00:13:54.200 --> 00:13:58.383
So basically that's this event here and this one, okay?

240
00:14:00.640 --> 00:14:03.720
So where do you think these event listeners

241
00:14:03.720 --> 00:14:05.700
should be located?

242
00:14:05.700 --> 00:14:08.230
Do you think that they should be outside here?

243
00:14:08.230 --> 00:14:09.763
So outside of the class.

244
00:14:10.680 --> 00:14:14.320
Well, that doesn't make a lot of sense, does it?

245
00:14:14.320 --> 00:14:17.830
So instead, just like before we actually want

246
00:14:17.830 --> 00:14:20.880
these event listeners, of course, to be set

247
00:14:20.880 --> 00:14:24.520
right at the beginning, so when a script first loads,

248
00:14:24.520 --> 00:14:29.023
but again, of course, that should be inside of the class.

249
00:14:29.900 --> 00:14:33.430
And so what is the method that automatically gets called

250
00:14:33.430 --> 00:14:35.680
as soon as the script loads?

251
00:14:35.680 --> 00:14:37.350
At least in this case.

252
00:14:37.350 --> 00:14:40.690
Well, again, it is the constructor.

253
00:14:40.690 --> 00:14:43.450
And so, we are gonna attach or event listeners

254
00:14:43.450 --> 00:14:47.083
to the dumb elements right here in the constructor.

255
00:14:50.160 --> 00:14:54.130
So, of course now we want to, again refactor this code

256
00:14:54.130 --> 00:14:57.053
a little bit more and take this function here,

257
00:14:58.010 --> 00:15:02.650
out of here to basically create its own function

258
00:15:02.650 --> 00:15:03.633
with this code.

259
00:15:04.780 --> 00:15:07.953
So that's all of this I believe, yeah.

260
00:15:10.390 --> 00:15:12.653
And so where should that go?

261
00:15:13.630 --> 00:15:16.940
Well, it should go here into newWorkout,

262
00:15:19.900 --> 00:15:23.660
because submitting the form for the newWorkout

263
00:15:23.660 --> 00:15:26.216
will of course create a new workout

264
00:15:26.216 --> 00:15:29.107
and so that's what this method here is all about.

265
00:15:30.750 --> 00:15:33.500
But then here, we also need the event

266
00:15:34.930 --> 00:15:36.180
so we can preventDefault.

267
00:15:37.107 --> 00:15:41.270
And then here again, we have the map event and the map,

268
00:15:41.270 --> 00:15:43.033
so we need the this keyword,

269
00:15:45.590 --> 00:15:48.640
or actually here we are just logging it to the console.

270
00:15:48.640 --> 00:15:50.343
So there's no need for this one,

271
00:15:51.700 --> 00:15:56.700
but here we need this.map like this, all right?

272
00:15:58.520 --> 00:16:02.100
But now, well, let's actually analyze

273
00:16:02.100 --> 00:16:03.350
what's gonna happen here.

274
00:16:04.500 --> 00:16:09.370
So first of all, of course, here we need to replace this one

275
00:16:09.370 --> 00:16:13.010
and actually call the newWorkout method

276
00:16:13.860 --> 00:16:18.653
and actually not call it, but just passing it in, right?

277
00:16:19.710 --> 00:16:23.960
Now, keep in mind that this method here is basically

278
00:16:23.960 --> 00:16:26.170
an event handler function.

279
00:16:26.170 --> 00:16:28.600
So it's a function that's gonna be called

280
00:16:28.600 --> 00:16:31.110
by an event listener.

281
00:16:31.110 --> 00:16:34.300
Now, do you remember what the this keyword looks like

282
00:16:34.300 --> 00:16:37.420
inside of an event listener function

283
00:16:37.420 --> 00:16:39.243
or of an event handler function?

284
00:16:40.240 --> 00:16:44.993
Well, just to make it really clear, let's take a look at it.

285
00:16:47.330 --> 00:16:51.473
So let's log the this keyword, now right?

286
00:16:55.250 --> 00:16:58.240
So again, we need to wait for the map to load

287
00:16:58.240 --> 00:17:01.110
and now as I click somewhere, then you see,

288
00:17:01.110 --> 00:17:02.773
we get some error here.

289
00:17:03.800 --> 00:17:08.043
So that's on line 60 cannot write private member map event.

290
00:17:09.330 --> 00:17:13.830
Okay, so let's go to line 60 and see what happens there.

291
00:17:13.830 --> 00:17:17.450
And so that's right here in this event handler function

292
00:17:17.450 --> 00:17:21.940
of the event listener on clicking on the map.

293
00:17:21.940 --> 00:17:25.230
So remember this is basically the add event listener

294
00:17:25.230 --> 00:17:27.853
equivalent from the leaflet library.

295
00:17:28.870 --> 00:17:31.670
So we need to fix this next, but for now,

296
00:17:31.670 --> 00:17:33.973
let's go back to the newWorkout method

297
00:17:33.973 --> 00:17:37.600
that we were working on and so I was trying to take a look

298
00:17:37.600 --> 00:17:39.850
at the this keyword here,

299
00:17:39.850 --> 00:17:42.880
but apparently that's not possible for now,

300
00:17:42.880 --> 00:17:44.600
so let's just remove it here

301
00:17:44.600 --> 00:17:47.223
and I will just tell you the solution.

302
00:17:48.060 --> 00:17:49.490
So I was asking you,

303
00:17:49.490 --> 00:17:52.380
what do you think the this keyword will be like

304
00:17:52.380 --> 00:17:55.780
in this method now, because this is an event handler

305
00:17:55.780 --> 00:17:58.750
function and so an event handler function

306
00:17:58.750 --> 00:18:02.170
will always have the this keyword of the dumb element

307
00:18:02.170 --> 00:18:04.800
onto which it is attached.

308
00:18:04.800 --> 00:18:08.580
And so in this case, that's gonna be the form Element.

309
00:18:08.580 --> 00:18:11.457
So again, inside of this method here,

310
00:18:11.457 --> 00:18:15.030
the this keyword is gonna point to Form

311
00:18:15.030 --> 00:18:18.140
and no longer to the App object.

312
00:18:18.140 --> 00:18:21.973
And so once again, we need to fix that using bind,

313
00:18:26.427 --> 00:18:27.610
all right?

314
00:18:27.610 --> 00:18:31.110
And this is actually a real pain point of working

315
00:18:31.110 --> 00:18:35.570
with event handlers in classes like we are doing right now.

316
00:18:35.570 --> 00:18:38.130
So even when you're working in the real world

317
00:18:38.130 --> 00:18:41.070
and you have event listeners inside of a class,

318
00:18:41.070 --> 00:18:44.090
you will be binding the this keywords all the time

319
00:18:44.090 --> 00:18:46.830
because otherwise many parts of your code

320
00:18:46.830 --> 00:18:48.810
are not gonna work.

321
00:18:48.810 --> 00:18:51.130
So again, in this case, because right

322
00:18:51.130 --> 00:18:53.750
in this method call, here did this keyword

323
00:18:53.750 --> 00:18:55.770
will simply point to the Form,

324
00:18:55.770 --> 00:18:58.310
but that's just not where we want.

325
00:18:58.310 --> 00:19:01.200
In most of these methods, we want this keyword

326
00:19:01.200 --> 00:19:04.550
to still point to the object itself.

327
00:19:04.550 --> 00:19:06.650
So in this case, the app object,

328
00:19:06.650 --> 00:19:10.830
which is what this is currently pointing to.

329
00:19:10.830 --> 00:19:14.490
And so here again, we will need to use the bind keyword

330
00:19:14.490 --> 00:19:18.370
and so this should now work, all right?

331
00:19:18.370 --> 00:19:21.270
Then we also have this one here to refactor,

332
00:19:21.270 --> 00:19:24.150
but actually there is another method

333
00:19:24.150 --> 00:19:28.690
that we want to implement, which is showForm, right?

334
00:19:28.690 --> 00:19:33.080
And so showForm is basically this code right here.

335
00:19:33.080 --> 00:19:34.883
So let's just cut it from here.

336
00:19:37.980 --> 00:19:41.150
then paste that here, all right?

337
00:19:41.150 --> 00:19:45.207
Now we of course also need this parameter here, now okay.

338
00:19:47.460 --> 00:19:52.033
And then here we will call this.showForm,

339
00:19:54.880 --> 00:19:57.530
but now if we run this code, then we will actually

340
00:19:57.530 --> 00:20:00.980
get the same error that we already saw the last time

341
00:20:00.980 --> 00:20:02.983
that we inspected our code.

342
00:20:04.800 --> 00:20:07.600
So the error that we saw previously, when I clicked

343
00:20:07.600 --> 00:20:10.823
on the map, and so that's gonna be this one.

344
00:20:11.700 --> 00:20:15.520
And so it says, again, that we cannot write this mapEvent

345
00:20:15.520 --> 00:20:20.482
property onto this object that we are trying to currently.

346
00:20:20.482 --> 00:20:22.180
And so once again, the reason for that

347
00:20:22.180 --> 00:20:26.070
is a incorrectly set this keyword.

348
00:20:26.070 --> 00:20:29.680
So again, this method here is right now being used

349
00:20:29.680 --> 00:20:33.400
as an event handler function right here.

350
00:20:33.400 --> 00:20:35.910
And so just like in regular JavaScript,

351
00:20:35.910 --> 00:20:40.360
the this keyword in this function here will then be set

352
00:20:40.360 --> 00:20:44.390
to the object onto which the event handler is attached.

353
00:20:44.390 --> 00:20:49.260
And so that's gonna be simply the map itself, okay.

354
00:20:49.260 --> 00:20:51.833
And so here we are trying to write mapEvent on the map.

355
00:20:54.390 --> 00:20:57.320
So again, the this keyword points to the map

356
00:20:57.320 --> 00:21:00.713
because this is where we attached the event handler on.

357
00:21:01.840 --> 00:21:05.050
And so once again, the solution to that is

358
00:21:05.050 --> 00:21:08.750
to bind the this keywords because the this keyword

359
00:21:08.750 --> 00:21:11.900
is the App object and so then here,

360
00:21:11.900 --> 00:21:14.070
this will also be the App object.

361
00:21:14.070 --> 00:21:17.513
And of course that's where we have the mapEvent property,

362
00:21:18.670 --> 00:21:19.583
so right here.

363
00:21:21.040 --> 00:21:21.873
Correct.

364
00:21:23.460 --> 00:21:25.650
So with that fixed it should now work

365
00:21:26.850 --> 00:21:29.630
and yeah, it does.

366
00:21:29.630 --> 00:21:33.660
And so now we can also test the refactoring of the Form

367
00:21:33.660 --> 00:21:34.990
that we just had before

368
00:21:36.470 --> 00:21:40.070
and indeed we get an error, but that's not problem

369
00:21:40.070 --> 00:21:43.420
that is completely normal when we are refactoring.

370
00:21:43.420 --> 00:21:47.853
So I'm sure we just forgot like a this keyword on line 78.

371
00:21:49.550 --> 00:21:54.530
So 78, yep that's correct.

372
00:21:54.530 --> 00:21:59.530
So here, of course we need this.mapEvent like this,

373
00:22:02.450 --> 00:22:04.890
let's give it another safe and another

374
00:22:04.890 --> 00:22:08.623
try and to then, we're actually almost done with this video.

375
00:22:10.570 --> 00:22:13.610
So, beautiful, now it works

376
00:22:13.610 --> 00:22:17.420
and now all we need to do is to refactor this last piece

377
00:22:17.420 --> 00:22:21.140
of code that we have in a constructor, because of course,

378
00:22:21.140 --> 00:22:24.430
we also don't want this function here

379
00:22:24.430 --> 00:22:26.700
to be right here in the constructor.

380
00:22:26.700 --> 00:22:29.780
So basically every small piece of functionality

381
00:22:29.780 --> 00:22:31.400
that is in our application,

382
00:22:31.400 --> 00:22:33.563
we now want to be its own function.

383
00:22:34.540 --> 00:22:37.420
So let's take this and for that,

384
00:22:37.420 --> 00:22:42.080
we have the toggleElevationField method, all right?

385
00:22:44.050 --> 00:22:46.680
Now this one here actually does not use

386
00:22:46.680 --> 00:22:48.530
the this keyword anywhere

387
00:22:48.530 --> 00:22:50.210
and so here, it doesn't matter

388
00:22:50.210 --> 00:22:52.920
what the this keyword will be like.

389
00:22:52.920 --> 00:22:56.900
And so therefore we don't have to bind it manually here

390
00:22:56.900 --> 00:22:59.853
because as I just said, it doesn't really matter.

391
00:23:00.810 --> 00:23:05.200
ElevationField, all right.

392
00:23:05.200 --> 00:23:08.270
So now our constructor nicely simply

393
00:23:08.270 --> 00:23:10.930
gets the currentPosition and then it adds

394
00:23:10.930 --> 00:23:13.980
these two event listeners to the Form

395
00:23:13.980 --> 00:23:15.763
and the input type element.

396
00:23:16.860 --> 00:23:18.463
So that's very nice and clean,

397
00:23:19.610 --> 00:23:22.543
everything is neatly organized into these methods.

398
00:23:23.640 --> 00:23:26.380
And so I think this is a really great structure

399
00:23:26.380 --> 00:23:28.170
that we just created here.

400
00:23:28.170 --> 00:23:31.820
And now indeed, we no longer need these very ugly

401
00:23:31.820 --> 00:23:36.053
global variables that we relied on before.

402
00:23:37.010 --> 00:23:40.410
And now let's just test if this one here is working as well

403
00:23:41.290 --> 00:23:44.930
and of course it is, all right.

404
00:23:44.930 --> 00:23:49.290
So great, we successfully implemented or architecture

405
00:23:49.290 --> 00:23:51.100
at least part of it.

406
00:23:51.100 --> 00:23:54.720
And so now in the next lecture, we will actually implement

407
00:23:54.720 --> 00:23:57.500
the rest of the architecture.

408
00:23:57.500 --> 00:24:01.200
So that's gonna be these other three classes here.

409
00:24:01.200 --> 00:24:02.893
So I hope to see you there soon.

