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(), чтобы установить уникальный идентификатор для вашего первичного ключа. Таким образом, оно связывается, когда вы настраиваете ваше сообщение, и вы можете ссылаться на него позже, когда оно будет отклонено, не беспокоясь о том, чтобы манипулировать информацией в другом месте.

Надеюсь это поможет!

Другие вопросы по тегам