자바스크립트/투두리스트
[Django & JS] 투두리스트 (4)
위르겐
2022. 5. 18. 12:25

Update 함수는 위 사진과 같이 작동한다.
function change_input_onclick(id, event) {
// 1. 해당 노드의 정보 받기.
// 2. 그 노드를 인풋 텍스트로 바꾸기
// 3. 버튼도 이제 수정완료로 바꾸기. !! 온클릭 이벤트 제대로 연결줘야함
let Edit_button = document.createElement('button');
let new_input = document.createElement('input');
let current_input = document.querySelector('.new_input');
let event_parent = event.target.parentElement;
let thirdNode = event_parent.children[2];
let current_value = event.target.innerHTML;
Edit_button.innerText = '수정!';
Edit_button.classList.add('btn_modify');
Edit_button.setAttribute("onclick", `edit_success_onclick(${id}, event)`);
new_input.classList.add('new_input');
new_input.classList.add('todo_list_li');
new_input.placeholder=`${current_value}`;
if (current_input) {
alert('한번에 하나만 수정해주세욥');
} else{
event_parent.removeChild(thirdNode);
event_parent.appendChild(new_input);
event_parent.appendChild(Edit_button);
}
}
Update에 필요한 함수는 두가지다.
작성되어있는 리스트의 글을 눌렀을 때
change_input_onclick 함수로 연결이 된다.
중요한 점은
이 때는 비동기 통신이 이루어지지 않고
input창과 수정버튼만 띄운다.
앞선 delete와 create함수의 axios 통신 방법이 전혀 없지 않은가?
event.target.parentElement 를 이용하여
클릭한 글씨의 부모요소인 li 태그를 가져왔고
li 태그의 세번째 요소인 span태그를 지운 후
새롭게 createElement로 생성한
Edit_button과 new_input
을 차례로 넣어주었다.
Edit_button에
setAttribute로 onclick속성을 추가해준다.
이 때 Edit_success_onclick함수로 연결이 되는데
여기서 서버와 통신을 시킨다.
function edit_success_onclick(id, event) {
let event_target = event.target;
let new_input = document.querySelector('.new_input');
let event_parent = event.target.parentElement;
let thirdNode = event_parent.children[2];
let span = document.createElement('span');
span.innerText = new_input.value;
span.style.cursor = "pointer"
span.setAttribute("onclick", `change_input_onclick(${id}, event)`);
// 1. 해당 노드의 정보 받기
// 2. 비동기 통신 보내기.
// 3. 성공하면 크리에이트 함수 동작 할 때의 노드 상태와 똑같이 바꾸기.
// 4. 실패하면 안되게 하기
axios({
url: `/todos/edit/`,
method: 'post',
headers: {
"content-type": "application/json",
'X-CSRFToken': getCsrfToken(),
},
data: {
'todo': new_input.value,
'id': id,
},
})
.then(function(response) {
let result = response.data['is_success']
if (result === true) {
if (new_input.value !== '') {
event_parent.removeChild(thirdNode);
event_parent.removeChild(event_target);
event_parent.appendChild(span);
} else {
alert('수정해주세요');
}
} else {
alert('fail');
console.log('d')
}
})
.catch((error) => {
console.log(error);
})
}
수정! 버튼인 Edit_button을 눌렀을 때
실행되는
edit_success_onclick 함수이다.
여기서의 event.target은 당연히 수정! 버튼이고
역시 마찬가지로
부모요소를 불러와 지우고 싶은 요소가 몇번째인지 파악한 후
수정!버튼과 New_input 요소를 지우고
New_input 요소에 입력된 value값을 새로운 span태그에 넣어준 후
span태그를 삽입해준다.
이제 거의 다 왔다 조금만 힘내자~
반응형