Проблема: я хочу удалить строку HTML, когда мой заголовок 1 (или 2, или 3,...) удаляется из JSON на сервере. Тем не менее, я могу сделать это только при обновлении.
Я пытался добавить метод AddCards после каждого вызова fetch, но тогда мне нужно было удалить все элементы tr, но я пробовал и это.
Вот изображение сайта.
Это код javascript:
let form = document.getElementById('frm');
form.addEventListener('submit', PostBlog)
let alleposts = {};
let numOfPosts = 0;
getPosts();
function PostBlog(event) {
event.preventDefault()
let title = document.getElementById("txtTitle");
let content = document.getElementById("txtContent");
let data1 = {content: content.value,title:title.value};
fetch("/posts",
{
method: 'POST',
mode:'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data1),
}
).then(receive).then(response => (response).text()).then(Succeed).catch(problem);
}
function receive(response) {
if (!(response.ok)){
throw new Error("Didn't Receive " + response.status);
}
return response;
}
function problem(error){
alert("Not Found " + error);
}
function Succeed(data){
alert("Found " + data);
getPosts();
}
function getPosts(){
fetch("/posts",{
method:'get',
headers: {
'Accept': 'application/json',
}
}).then(receive).then(response => response.json()).then(Succeed2).catch(problem);
}
function Succeed2(data){
alert("Found " + JSON.stringify(data));
data.forEach((data) => alleposts[`${data.title}`] = data.uuid);
AddCards();
}
function AddCards(){
Object.keys(alleposts).forEach((sleutel)=>{VoegVorigePostToe(sleutel)});
}
function Succeed3(data){
alert("Found " + data);
numOfPosts--;
}
function DeletePost(event){
let title = event.target.parentNode.previousElementSibling.innerText;
console.info(title);
let key = alleposts[title];
console.info("alle keys " + JSON.stringify(key));
fetch(`/posts/${key}`,{
method:'delete',
headers: {
'Accept': 'application/json',
}
}).then(receive).then(response => (response).text()).then(Succeed3).catch(problem);
}
function VoegVorigePostToe(title){
//let title = document.getElementById("txtTitle");
let thead = document.getElementsByTagName("thead")[0];
let th = document.createElement("tr");
let td = document.createElement("td");
td.setAttribute("id", "th_" + numOfPosts);
td.innerText = title;
let delete_button = document.createElement("td");
let button = document.createElement("button");
button.innerHTML = "Delete";
button.addEventListener("click",DeletePost)
delete_button.appendChild(button);
th.appendChild(td);
th.appendChild(delete_button);
thead.appendChild(th);
numOfPosts++;
}
HTML-идентификатор выглядит следующим образом: frm = form, txtTitle = поле ввода заголовка.
Я добавляю заголовок и некоторый контекст, затем отправляю его, чтобы он был добавлен на сервер json. Если я хочу удалить сообщение с сервера, мне нужно обновить его до того, как вызов fetch найдет его, когда я нажму кнопку удаления. Предполагается, что он сначала получит все сообщения, а затем удалит тот, по которому щелкнули, чтобы он был «актуальным».
Ах я вижу. Когда вы вызываете конечную точку POST, отвечает ли сервер обновленным набором данных JSON? Тот же вопрос возникает при использовании DELETE?
Да вот что странно. Он обновляется на самом сервере, но не на странице.
@EmielZuurbier Мне удалось решить проблему с вызовами выборки, но я обновил этот пост, указав проблему, которая осталась. Я пробовал несколько способов фактически удалить элемент html tr при удалении с сервера. Но это, похоже, не сработало.
Уже решил это с помощью:
function DeleteRow(event) {
let btn = event.target;
$(btn).closest("tr").remove();
}
Не могли бы вы объяснить, в чем проблема, как можно проще? Похоже, у вас проблемы с синхронизацией данных с сервера на клиент? В
DeletePost
вы первый получаете все публикации и потом удаляете публикацию, на которую вы нажали. Разве не должно быть наоборот?