Показать сообщение отдельно
  #3 (permalink)  
Старый 12.08.2011, 18:24
Аватар для Gremlin
Интересующийся
Отправить личное сообщение для Gremlin Посмотреть профиль Найти все сообщения от Gremlin
 
Регистрация: 12.08.2011
Сообщений: 15

К сожалению этот способ не помогает - все немного сложнее.
Задача - создать окно, аналогичное по функциям Джаваскриптовскому Confirm. Но чтобы оно было красивое ))). Функция получает в себя строки, которые будут выводитья в окне, и callback-функцию, которая будет быполняться в случае нажатия на кнопку подстверждения.
Вот функция вывода окна:
areYouSure: function(title,question,okText,cancelText,myCallback){
        $.ajax({	
            url: "/views/V_Common/V_AreYouSure.php",	//получаем с сервака ХТМЛ-код будущего окна
            dataType: "html", 
            success: function(data) {
                var sureBox = $(data); //начинаем создавать ДОМ-Элемент
                sureBox.attr('title',title); 
                sureBox.find('p').text(question);
                sureBox.find('#ok').text(okText);
                sureBox.find('#ok').bind('click',myCallback); /*вешаем колбэк, на кнопку ОК (который, меня уже задолбал сразу запускаться)*/
                sureBox.find('#ok').click(function(){sureBox.dialog( "close" );});
                sureBox.find('#cancel').text(cancelText);
                sureBox.find('#cancel').click(function(){sureBox.dialog( "close" );});
                sureBox.appendTo($('body')); /*Запихиваем новый элемент в ДОМ и делаем из него выпадающее окошко при помощи jQuery UI*/
                sureBox.dialog({resizable: false,
                        draggable: false,
                        modal: true,
                        show: 'fade',
                        hide: 'fade',
                        position: ['center',180]
                });
            },
            error: function (XMLHttpRequest, textStatus, errorThrown){
               Common.makeAlert('AJAX не прокатил', 'Какая-то ошибка');
            }
        });
    }

Простой пример использования данной функции:
askLogout: function(){
        this.areYouSure('Предупреждение', 'Вы уверенны что хотите выйти?', 'Выйти', 'Нет', this.logout())        
    },
    logout: function(){
        document.location.href = "/logout/";
    },


Пример использования чуть посложнее:

Common.areYouSure('Предепреждение', 
                                        'После удаления группу будет невозможно восстаеновить.Вы уверены что хотите удалить эту группу?',
                                        'Удалить группу', 'Отмена',
                                        Groups.destroy(id_group));

destroy: function(id_group){
        //alert('Удалялка группы' + id_group);
        $.ajax({
            type: "POST",		
            url: "/index.php?controller=C_Groups&method=destroyGroup",	
            data: 'id_group=' + id_group,
            dataType: "xml", 
            success: function(data) {
                var canDestroy = $(data).find('canDestroy').text();
                switch (canDestroy) {
                    case 'yes':
                        Common.makeAlert('Поздравляем!', 'Вы удалили данную группу');
                        break;
                    case 'notOwner':
                        Common.makeAlert('Предупреждение!', 'Вы не можете удалить эту группу потому-что не являетесь ее владельцем');
                        break;    
                    default:
                        break;
                }

            },
            error: function (XMLHttpRequest, textStatus, errorThrown){
               Common.makeAlert('AJAX не прокатил', 'Какая-то ошибка');
            }
        });
    }

Это к тому что каждый раз в колбэк может передаваться разное количество параметров, а могут не передаваться и вовсе. И функции - колбэки могут быть слишком громоздкими, для того чтобы - делать их анонимными.

Пока-что я нашел такой рабочий способ вызова, но он не очень хорош:
askLogout: function(){
        this.areYouSure('Предупреждение', 
                               'Вы уверенны что хотите выйти?', 
                               'Выйти', 
                               'Нет', 
                               function(){Common.logout()})        
    },

Данный способ плох по следующей причине:
logout и areYouSure являются методами одного и того-же обьекта common. Приходиться вызывать метод текущего объекта не по-человечески через this (this.logout()), а через конкретно его имя (Common.logout()), что не очень-то красиво.

Я даже вопрос немного переформулировал:

Как правильно и красиво передать внутрь функции А параметром функцию Б в виде колбека, чтобы выполнилось следующее:
1 - Функция Б (колбэк) будет подписана на событие внутри функции А
2 - Функция Б может оказатья любой, следовательно количество передаваемых параметров в функцию Б может быть различное.
Ответить с цитированием