-
Notifications
You must be signed in to change notification settings - Fork 0
/
javascript.html
356 lines (249 loc) · 10.6 KB
/
javascript.html
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>
JavaScript - IMLC.ME
</title>
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="atom.xml" rel="alternate" title="IMLC.ME" type="application/atom+xml">
<link href="asset/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<link href="asset/stylesheets/font-awesome.min.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="asset/javascripts/jquery.min.js"></script>
<script src="asset/highlightjs/highlight.pack.js"></script>
<link href="asset/highlightjs/styles/solarized_dark.css" media="screen, projection" rel="stylesheet" type="text/css">
<script>hljs.initHighlightingOnLoad();</script>
<!--[if lt IE 9]><script src="asset/javascripts/html5.js"></script><![endif]-->
<!-- <link href='http://fonts.googleapis.com/css?family=Nunito:400,300,700' rel='stylesheet' type='text/css'> -->
<style type="text/css">
/* latin */
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 300;
src: local('Nunito-Light'), url(asset/font/1TiHc9yag0wq3lDO9cw0voX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
/* latin */
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 400;
src: local('Nunito-Regular'), url(asset/font/6TbRXKWJjpj6V2v_WyRbMX-_kf6ByYO6CLYdB4HQE-Y.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
/* latin */
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 700;
src: local('Nunito-Bold'), url(asset/font/TttUCfJ272GBgSKaOaD7KoX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
</style>
<style type="text/css">
.container .left-col{ opacity: 1;}
#pagenavi a{ font-size: 1.3em;}
#pagenavi .next:before{ top: 3px;}
#pagenavi .prev:before{ top: 3px;}
#projects-nav {margin-left: 10px;}
#projects-nav li {
list-style: none;
}
.container .mid-col .mid-col-container #content .archives .title{ font-size: 1.5em;}
.container .mid-col .mid-col-container #content article{ padding: 15px 0px;}
#header .subtitle {
line-height: 1.2em;
padding-top: 8px;
}
article pre{ background: none; border: none; padding: 0;}
article .entry-content{text-align: left;}
.share-comment{ padding: 25px 0px; clear: both;}
hr{ margin: 20px 0px;border: 0; border-top:solid 1px #ddd;}
</style>
</head>
<body>
<div class="container">
<div class="left-col">
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<img src="/asset/icon.jpg" style="width:160px;">
</div>
<h1><a href="index.html">IMLC.ME</a></h1>
<p class="subtitle"></p>
<nav id="main-nav">
<ul class="main">
<li id=""><a target="self" href="index.html">Home</a></li>
<li id=""><a target="_self" href="archives.html">Archives</a></li>
</ul>
</nav>
<nav>
My Projects
<ul id="projects-nav">
</ul>
</nav>
<nav id="sub-nav">
<div class="social">
<a target="_blank" class="github" target="_blank" href="https://github.com/lawrenceching" title="GitHub">GitHub</a>
<a class="rss" href="atom.xml" title="RSS">RSS</a>
</div>
</nav>
</header>
</div>
</div>
<div class="mid-col">
<div class="mid-col-container">
<div id="content" class="inner">
<div itemscope itemtype="http://schema.org/Blog">
<article class="post" itemprop="blogPost" itemscope itemtype="http://schema.org/BlogPosting">
<div class="meta">
<div class="date">
<time datetime="2018-05-02T20:47:19+08:00" itemprop="datePublished">2018/5/2</time>
</div>
<div class="tags">posted in
<a class='category' href='javascript.html'>JavaScript</a>
</div>
</div>
<h1 class="title" itemprop="name"><a href="note-a-debugging-of-vue-js-v-if.html" itemprop="url">
Note a debugging of Vue.js v-if</a></h1>
<div class="entry-content" itemprop="articleBody">
<p>Today my workmate hit an issue that v-if didn't work for him.<br/>
It turned out that Vue.js can't watch the property that you do not define at the beginning.</p>
<h2 id="toc_0">Root Cause</h2>
<p>It's not only relative to v-if. It impact all functions that used two-way data binding.</p>
<p>On below demo, we have two section that both of them hope to change content by button clicking. Section 1 works good but section 2 didn't.</p>
<p>It's because section2 object(in js) doesn't define content property.<br/>
So after Vue runs up, the new property that you add afterward can't be watched by Vue. And then you will fine your change will not reflect to web page even if you change the value of the property.</p>
<p>In this demo, I tried to change the content of section 2 but it didn't work. In my workmate's case, it change the value of a property but v-if was not triggered.</p>
<p>Live Demo: <a href="https://jsfiddle.net/Lawrence/7eq3y5uv/">https://jsfiddle.net/Lawrence/7eq3y5uv/</a><br/>
<iframe src="https://jsfiddle.net/Lawrence/7eq3y5uv/embedded/" width="800px" height="500px"><br/>
</iframe></p>
<h2 id="toc_1">Look Deeper</h2>
<p>When Vue.js starts, it will convert all data into observable. The key is how Vue.js do that here.</p>
<p>Vue.js will bind <code>Watcher</code> on each properties of an object by defining <code>set</code> method using <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty">Object.defineProperty</a>. Therefore Vue.js can get updated if you change the value.</p>
<p>Apparently, if you don't define an property for an object at the beginning, Vue.js can't watch it.</p>
</div>
</article>
<article class="post" itemprop="blogPost" itemscope itemtype="http://schema.org/BlogPosting">
<div class="meta">
<div class="date">
<time datetime="2016-09-27T18:17:56+08:00" itemprop="datePublished">2016/9/27</time>
</div>
<div class="tags">posted in
<a class='category' href='javascript.html'>JavaScript</a>
</div>
</div>
<h1 class="title" itemprop="name"><a href="14749714760420.html" itemprop="url">
JavaScript 定义 class 的一种解决方案</a></h1>
<div class="entry-content" itemprop="articleBody">
<p>这是由荷兰程序员 Gabor de Mooij 提出的一种比较简单的方法。Gabor de Mooij 称之为 minimalist approach。现摘录如下:</p>
<h5 id="toc_0">定义一个 Foo 类</h5>
<pre><code>var Foo = {
createNew: function(){
var instance = {};
instance.description = "A new class instance";
instance.bar = function() { console.log(instance.description)};
return instance;
}
}
</code></pre>
<h5 id="toc_1">创建一个 Foo 实例</h5>
<pre><code>var foo = Foo.createNew();
foo.bar();
</code></pre>
<h5 id="toc_2">类的继承</h5>
<pre><code>var NewFoo = {
createNew = function(){
var instance = Foo.createNew();
instance.title = "A new title";
instance.newBar = function(){
alert(instance.description);
};
}
}
</code></pre>
<h5 id="toc_3">私有方法和属性</h5>
<pre><code>var Foo = {
createNew: function(){
var instance = {};
instance.description = "A new class instance"; //description 是私有的,只有通过 bar() 来访问
instance.bar = function() { console.log(instance.description)};
return instance;
}
}
</code></pre>
<h5 id="toc_4">静态成员变量</h5>
<pre><code>var Foo = {
id: 101010; // id 在多个实例间共享
createNew: function(){
var instance = {};
instance.description = "A new class instance"; //description 是私有的,只有通过 bar() 来访问
instance.bar = function() { console.log(instance.description)};
return instance;
}
}
var foo1 = Foo.createNew();
var foo2 = Foo.createNew();
foo2.id = 233333;
console.log("Foo id:"+foo1.id);
</code></pre>
</div>
</article>
<article class="post" itemprop="blogPost" itemscope itemtype="http://schema.org/BlogPosting">
<div class="meta">
<div class="date">
<time datetime="2016-09-27T18:17:56+08:00" itemprop="datePublished">2016/9/27</time>
</div>
<div class="tags">posted in
<a class='category' href='javascript.html'>JavaScript</a>
</div>
</div>
<h1 class="title" itemprop="name"><a href="14749714760916.html" itemprop="url">
Save and load object in localStorage</a></h1>
<div class="entry-content" itemprop="articleBody">
<p>As for the reason only string can be stored in localStorage, an object need to be converted to string format (JSON text).</p>
<h3 id="toc_0">Save object</h3>
<pre><code>var books = [{id:3, name:"From Zero To One"}, {id:4, name:"Head First Java"}];
localStorage.setItem("books", JSON.stringify(books));
</code></pre>
<h3 id="toc_1">Load object</h3>
<pre><code>var booksJSON = localStorage.getItem("books");
if( booksJSON == null ){
// No data stored in the localStorage
return;
}
var books = JSON.parse(booksJSON);
for(var i=0; i < books.length; ++i) {
var book = books[i];
var id = book.id;
var name = book.name;
}
</code></pre>
</div>
</article>
</div>
<nav id="pagenavi">
<div class="center"><a href="archives.html">Blog Archives</a></div>
</nav>
</div>
</div>
<footer id="footer" class="inner">Copyright © 2018
Powered by <a target="_blank" href="http://www.mweb.im">MWeb</a>
Theme by <a href="http://shashankmehta.in/archive/2012/greyshade.html">Shashank Mehta</a>
<a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15018861号</a>
</footer>
</div>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-57304811-3', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>