глобальная переменная javascript, возвращающаяся в предыдущее состояние при следующем вызове события - PullRequest
2 голосов
/ 04 августа 2011

Итак, у меня есть глобальная переменная

var INSIDE_GLOBAL = {} ;
INSIDE_GLOBAL.current_search = get_new_current_search();

function get_new_current_search() {

    return {
        stack:[],
        search_options: {
            keywords: ""
            },
        };
}

Затем я настраиваю обработчики для нажатия на разные секции div в аккордеоне. Это добавляет новый раздел к аккордеону, делает его просматриваемым в данный момент разделом и устанавливает обработчики щелчков для следующих разделов с той же функцией (setup_search_click_handlers).

function setup_search_click_handlers() {
    $('.search_option').unbind("click");
    $('.search_option').bind("click", function(e) {

        var new_sub_group = $(this).attr('id');

        $("#new_search_panel").bind("accordionchange", function(event, ui) { 
            $("#new_search_panel").unbind("accordionchange");

            //push new section onto the current searches
            INSIDE_GLOBAL.current_search.stack.push(new_sub_group);

            /* pseudo code */
            accordion_add_section_and_select_that_section( with_callback: setup_search_click_handlers );
        });

        $("#new_search_panel").accordion("activate",-1);    //Collapse the accordion, calls the newly binded change             

    });

}

В конце первого клика INSIDE_GLOBAL.current_search.stack содержит элемент; Однако, когда происходит следующее событие щелчка и вызывается связанная функция, INSIDE_GLOBAL.current_search.stack снова становится пустым. Не могу понять, почему.

Я предполагаю, что это имеет какое-то отношение к объему различных обратных вызовов, но на самом деле не уверен.

В firebug я вижу, что окно INSIDE_GLOBAL корректно меняется, затем «сбрасывается» туда, где массив стека снова пуст

1 Ответ

0 голосов
/ 05 августа 2011

Просто разобрался. Имеет смысл, что я потратил бы часы, пытаясь выяснить проблему, а затем найти ее через несколько минут после публикации здесь.

Я только что добавил массив стека в свой код и изменил некоторые индексы, передаваемые в методах, на использование поля stack.length.

У меня есть привязка в другом месте, которая вызывает функцию всякий раз, когда аккордеон минимизируется. Это используется, когда человек нажимает предыдущий раздел в аккордеоне (возвращаясь назад в поиске). Он проверяет несколько параметров, чтобы убедиться, что это так, и удаляет разделы аккордеона после того, который пользователь щелкнул. при этом он также вызывает stack.pop (), чтобы поддерживать данные бэкэнда в актуальном состоянии.

Переходя от использования индексных переменных к переменной длины, при первом сворачивании аккордеона эта проверка будет неправильно проходить и вставлять переменную just в стек ...

Вот часть кода для любопытных

function setup_return_to_previous_handlers() {

    var event_function = function(event, ui) { 

        var active_index = $("#new_search_panel").accordion( "option", "active" );
        var index = INSIDE_GLOBAL.current_search.stack.length; //BUG here: needs to be length-1;
        //alert("accord_change: active:"+active_index+" index:"+index);
        if (    typeof active_index==="number" &&   //Filter's active === false, if user clicked last section
                active_index >= 0 &&                //Filters refreshes
                active_index != index ) {           //User clicked previous section
            $("#new_search_panel").unbind("accordionchange");
            bind_search_buttons();
            //alert("inside");
            for ( ; index > active_index; --index) {
                /* remove accordion sections */

                INSIDE_GLOBAL.current_search.stack.pop(); //Bug: Shouldn't have been called
            }

        }
    };
    $("#new_search_panel").unbind("accordionchange");
    $("#new_search_panel").bind("accordionchange", event_function); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...