jGrowl и Close Callback для запроса Ajax?
У меня есть вопрос jQuery / jGrowl, касающийся того, как поддерживать состояние представленных jGrowls. У меня есть система уведомлений, которую я построил с использованием PHP/MySQL. Это легкая часть. Мне удалось получить правильное отображение jGrowls.
Теперь я хотел бы поддерживать состояние messages/jGrowls до тех пор, пока пользователь не нажмет "Закрыть" для каждого отдельного jGrowl или ссылку "Закрыть все", которая закрывает все jGrowls. У меня есть таблица MySQL users_notifications, где я могу управлять тем, какие уведомления были "прочитаны". Я предполагаю, что лучшим подходом было бы сделать запрос getJSON (ajax) обратно на сервер с помощью обратных вызовов close() или beforeClose(), но я не уверен, как это написать. Мне нужно передать идентификатор уведомления обратно через запрос.
<?php
if (!empty($notifications))
{
foreach ($notifications as $notification)
{
?>
<script>
<!--
$(document).ready(function() {
var notification = <?php echo json_encode($notification); ?>;
$.jGrowl(notification.message, {
beforeClose: function(){
var markReadUrl = '<?php echo site_url('notifications/ajax_mark_as_read') ?>' + '/' + notification.id;
$.getJSON(markReadUrl, function(data) {
console.log(data);
});
}
});
});
//-->
</script>
<?php
}
}
?>
Обновление 02/12: я думаю, что узнал, что меня смущало.
При тестировании я использовал 2 или 3 уведомления (jGrowls). Я ожидал, что функция обратного вызова beforeClose() будет срабатывать, когда пользователь нажимает на отдельную ссылку закрытия jGrowl, ссылку "x" в правой части jGrowl. Есть ли обратный вызов для закрытия "х"? Обратите внимание, что обратный вызов beforeClose() срабатывает правильно, когда пользователь нажимает "закрыть все", и запускает функцию для каждого jGrowl. Таким образом, в некотором смысле, "закрыть все" действует как ссылка "Пометить все как прочитанное", а ссылки "x" ничего не делают. Это предполагаемая функциональность?
1 ответ
Вы правы, у вас есть выбор из двух различных колбэков, которые вы можете использовать "закрыть" или "перед тем, как закрыть". Я бы, вероятно, выбрал "beforeClose", так как в этот момент уведомление было отклонено, и затем начнется процесс его удаления со страницы.
Таким образом, использование обратного вызова может выглядеть так:
$.jGrowl('Message here...', {
beforeClose: function(){
$.ajax({
url: '/path/to/dismiss/action',
success: function(){}
});
}
});
Если это то, что вы будете использовать в каждом уведомлении, вы можете сделать следующее...
$.jGrowl.defaults.beforeClose = function(){
//...
}
Я предполагаю, что вам нужно будет как-то индивидуально отслеживать уведомление, поэтому, когда вы делаете ajax-запрос на его отклонение, вы возвращаете первичный ключ или что-то в этом роде. Одна вещь, которую я бы предложил, - это использовать обратный вызов beforeOpen и метод data(), чтобы установить уникальный идентификатор для вашего первичного ключа. Таким образом, оно связывается, когда вы настраиваете ваше сообщение, и вы можете ссылаться на него позже, когда оно будет отклонено, не беспокоясь о том, чтобы манипулировать информацией в другом месте.
Надеюсь это поможет!