So i have an admin page to handle status of items in the inventory. It is running on Node, using ejs template and mongoDb.
I was having a post action, and it is running fine when using a redirect link to reload the whole page.
Now i am changing to use ajax to handle a partial view update instead of reloading.
This is my url post action using res.json() to send the updated result to client side:
router.post("/change-status/:id/:status", (req, res, next) => {
let currentStatus = ParamsHelpers.getParam(req.params, "status", "active");
let id = ParamsHelpers.getParam(req.params, "id", "");
console.log("This is being called");
ArticleModel.changeStatus(id, currentStatus, { task: "update-one" }).then(
result => {
//res.redirect(linkIndex); // this is how it works with redirect which reload the whole page
res.json(result);
}
);
});
The result above is sent to client and handle after an ajax called. It is inside an action click on a tag.
$("a[href*='change-status']").on("click", function(e) {
e.preventDefault();
e.stopPropagation();
console.log("ajax is called");
var thisElement = $(this);
var parent = $(this).parent();
$.ajax({
url: this.href, // current href of a tag
type: "POST",
dataType: "json",
success: function(data) {
$(thisElement).remove();
$(parent).append(
statusHelper("admin123/article/", data.status, data._id)
);
},
error: function(jqXHR, textStatus, err) {
alert("text status " + textStatus + ", err " + err);
}
});
});
On successful, it replaces current a tag with another one, with a different link (the two links are below).
On the first click, the action is posted correctly, the data is sent correctly and the html is replaced / updated correctly by statusHelper method.
I double checked and the link before the first clicked and after the first clicked is similar.
a href 1st click:
http://localhost:6969/admin123/article/change-status/5e7cafc29d6d971b00cb5459/inactive
a href 2nd click:
http://localhost:6969/admin123/article/change-status/5e7cafc29d6d971b00cb5459/active
But when i clicked again to update the status the 2nd time, it routes me to that route instead of doing an ajax post.
May I know where i did thing wrong? If more codes needed pls let me know.