๐ป ๊ณต๋ถ ๊ธฐ๋ก/๐๏ธ JavaScript
Ajax/JQuery | ์ข์์ ๊ธฐ๋ฅ
- -
์๋ฒ
- ์ฐ์ ์๋ฒ ์ชฝ ๊ธฐ๋ฅ์ ๋จผ์ ์๊ฐํด๋ด ์๋ค. ํํธ๋ฅผ ๋๋ฅด๋ฉด 1) ์ด๋ค ํฌ์คํธ๋ฅผ 2) ๋๊ฐ ๋๋ ๊ณ 3) ์ข์์์ธ์ง ์ข์์ ์ทจ์์ธ์ง๋ฅผ ์์์ผ๊ฒ ์ฃ ? ์์ ๋ก ๋ง๋ค ๋ค๋ฅธ ๋ฐ์๋ค(โญ, ๐)์ ์๊ฐํ๋ฉด ์ด๋ ์์ด์ฝ์ ๋๋ ๋์ง๋ ์์์ผ๊ฒ ๋ค์.
- DB์ ์ ์ฅํ ๋๋ 1) ๋๊ฐ 2) ์ด๋ค ํฌ์คํธ์ 3) ์ด๋ค ๋ฐ์์ ๋จ๊ฒผ๋์ง ์ธ ์ ๋ณด๋ง ๋ฃ์ผ๋ฉด ๋๊ณ , ์ข์์์ธ์ง, ์ทจ์์ธ์ง์ ๋ฐ๋ผ ํด๋น ๋ํ๋จผํธ๋ฅผ insert_one()์ ํ ์ง delete_one()์ ํ ์ง ๊ฒฐ์ ํด์ฃผ์ด์ผํฉ๋๋ค.
if action_receive =="like":
db.likes.insert_one(doc)
else:
db.likes.delete_one(doc)
- ์ข์์ ์ปฌ๋ ์ ์ ์ ๋ฐ์ดํธํ ์ดํ์๋ ํด๋น ํฌ์คํธ์ ํด๋น ํ์ ์ ๋ฐ์์ด ๋ช ๊ฐ์ธ์ง๋ฅผ ์ธ์ ๋ณด๋ด์ฃผ์ด์ผํฉ๋๋ค.
count = db.likes.count_documents({"post_id": post_id_receive, "type": type_receive})
API
user_info = db.users.find_one({"username": payload["id"]})
post_id_receive = request.form["post_id_give"]
type_receive = request.form["type_give"]
action_receive = request.form["action_give"]
doc = {
"post_id": post_id_receive,
"username": user_info["username"],
"type": type_receive
}
if action_receive =="like":
db.likes.insert_one(doc)
else:
db.likes.delete_one(doc)
count = db.likes.count_documents({"post_id": post_id_receive, "type": type_receive})
return jsonify({"result": "success", 'msg': 'updated', "count": count})
ํด๋ผ์ด์ธํธ
- API์์ ์๊ตฌํ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ์ ์ ๋ณด, ํฌ์คํธ ์์ด๋, ์ข์์/์ข์์ ์ทจ์, ์์ด์ฝ ์ข ๋ฅ์ ๋๋ค.
- ์ฌ๊ธฐ์์ ํํธ๋ฅผ ๋๋ฅธ ์ฌ๋์ ์ ๋ณด๋ ๋ก๊ทธ์ธ ์ ๋ณด์์ ๋ฐ์์์ผ๋ฏ๋ก ๋๋จธ์ง 3๊ฐ๋ง ๋ฐ์ดํฐ๋ก ๋ณด๋ด์ฃผ๋ฉด ๋ฉ๋๋ค.
- ์ข์์์ธ์ง, ์ข์์ ์ทจ์์ธ์ง๋ ์์ด์ฝ์ ํด๋์ค๊ฐ fa-heart์ธ์ง fa-heart-o์ธ์ง๋ก ์ ์ ์์ต๋๋ค.
- ์ ๋ฐ์ดํธ์ ์ฑ๊ณตํ๋ฉด ์์ด์ฝ์ ํด๋์ค๋ฅผ ๋ฐ๊พธ๊ณ ์ข์์ ์ซ์๋ ์ ๋ฐ์ดํธํด์ค๋๋ค.
function toggle_like(post_id, type) {
console.log(post_id, type)
let $a_like = $(`#${post_id} a[aria-label='heart']`)
let $i_like = $a_like.find("i")
if ($i_like.hasClass("fa-heart")) {
$.ajax({
type: "POST",
url: "/update_like",
data: {
post_id_give: post_id,
type_give: type,
action_give: "unlike"
},
success: function (response) {
console.log("unlike")
$i_like.addClass("fa-heart-o").removeClass("fa-heart")
$a_like.find("span.like-num").text(response["count"])
}
})
} else {
$.ajax({
type: "POST",
url: "/update_like",
data: {
post_id_give: post_id,
type_give: type,
action_give: "like"
},
success: function (response) {
console.log("like")
$i_like.addClass("fa-heart").removeClass("fa-heart-o")
$a_like.find("span.like-num").text(response["count"])
}
})
}
}
์ข์์ ์ซ์ ํ์ํ๊ธฐ
- ์ฐ์ ์๋ฒ์์ ํฌ์คํธ ๋ชฉ๋ก์ ๋ณด๋ด์ค ๋ ๊ทธ ํฌ์คํธ์ ๋ฌ๋ฆฐ ํํธ๊ฐ ๋ช ๊ฐ์ธ์ง, ๋ด๊ฐ ๋จ ํํธ๋ ์๋์ง ๊ฐ์ด ์ธ์ด ๋ณด๋ด์ค๋๋ค.
for post in posts:
post["_id"] = str(post["_id"])
post["count_heart"] = db.likes.count_documents({"post_id": post["_id"], "type": "heart"})
post["heart_by_me"] = bool(db.likes.find_one({"post_id": post["_id"], "type": "heart", "username": payload['id']}))
- ํด๋ผ์ด์ธํธ์์๋ ์ด ์ ๋ณด๋ฅผ ๋ฐ์ ์ฐฌ ํํธ("fa-heart")๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ธ์ง, ๋น ํํธ("fa-heart-o")๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ธ์ง ๊ฒฐ์ ํฉ๋๋ค.
let class_heart = ""
if (post["heart_by_me"]) {
class_heart = "fa-heart"
} else {
class_heart = "fa-heart-o"
}
- ์ด๊ฒ์ '์กฐ๊ฑด๋ถ ์ผํญ ์ฐ์ฐ์(ternary operator)'๋ฅผ ์ฐ๋ฉด ํ ์ค๋ก ๋ํ๋ผ ์ ์์ด์!
let class_heart = post['heart_by_me'] ? "fa-heart": "fa-heart-o"
- ์ด ์ ๋ณด๋ฅผ html_temp๋ฅผ ๋ง๋ค ๋ ํํธ ๊ฐ์์ ํจ๊ป ๋ฃ์ด์ฃผ๋ฉด ๋!
<span class="icon is-small"><i class="fa ${class_heart}" aria-hidden="true"></i></span>
<span class="like-num">${post["count_heart"]}</span>
์ข์์ ์ซ์๋ ํ์์ ์กฐ๊ธ ๋ฐ๊ฟ๋ณผ๊น์?
- ์ฐ์ 10,000๊ฐ๊ฐ ๋์ผ๋ฉด '12k'์ฒ๋ผ ์ ์+k ํ์์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
- 500๊ฐ๊ฐ ๋์ผ๋ฉด '0.5k'์ฒ๋ผ ์์ซ์ ์๋ ํ ์๋ฆฌ ์์์ ๋ฐ์ฌ๋ฆผํด์ค๋๋ค.
- ์ข์์ ์๊ฐ 0๊ฐ์ผ ๋๋ ์ซ์๋ฅผ ์ ์ง ์์ต๋๋ค.
- ์์ ์ซ์๋ ๊ทธ๋๋ก ์ ์ต๋๋ค.
function num2str(count) {
if (count > 10000) {
return parseInt(count / 1000) + "k"
}
if (count > 500) {
return parseInt(count / 100) / 10 + "k"
}
if (count == 0) {
return ""
}
return count
}
- get_posts()์ toggle_like() ์์ ๋ฃ์ด์ค๋๋ค.
// get_posts()
<span class="icon is-small"><i class="fa ${class_heart}" aria-hidden="true"></i></span>
<span class="like-num">${num2str(post["count_heart"])}</span>
// toggle_like()
$a_like.find("span.like-num").text(num2str(response["count"]))
JS ํ์ผ ๋ถ๋ฆฌํ๊ธฐ
- ์ฌ๋ฌ ํ์ด์ง์ ๊ฑธ์ณ ์ฐ์ด๋ CSS ๋ด์ฉ์ mystyle.css ํ์ผ์ ์ ์ด ๊ณต์ ํ ์ ์๋ฏ, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ํ์ผ์ ๋ถ๋ฆฌํ์ฌ ๋ค๋ฅธ html์์ ์ํฌํธํด์ฌ ์ ์์ต๋๋ค.
- ํฌ์คํ ๊ด๋ จ ํจ์๋ค์ ํ๋กํ ํ์ด์ง์์๋ ์ฐ์ด๋ฏ๋ก JS ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ๋ด ์๋ค.
- static ํด๋ ์์ myjs.js ํ์ผ์ ๋ง๋ค๊ณ ํจ์๋ค์ ๋ณต์ฌํด ๋ฃ์ต๋๋ค.
- HTML ์์๋ ์๋์ ๊ฐ์ด ์ํฌํธํด์ต๋๋ค.
<script src="{{ url_for('static', filename='myjs.js') }}"></script>
'๐ป ๊ณต๋ถ ๊ธฐ๋ก > ๐๏ธ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JS/Refactoring | ํด๋ก์ , ์ฝ๋ฐฑ (0) | 2023.05.26 |
---|---|
JavaScript | ํด๋ก์ ํจ์ (0) | 2023.05.26 |
Ajax/JQuery | ์ฌ์ง ์ ๋ก๋ (0) | 2023.01.02 |
Element select(); (0) | 2023.01.02 |
Event | HTML์ event ์ข ๋ฅ (0) | 2023.01.02 |
Contents
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค