全局对象即使被替换也会返回原始值

时间:2016-08-18 07:13:09

标签: javascript javascript-objects

在初始页面加载时,我创建了一个全局对象。然后使用函数设置其值。

function setPaginationData(data, table_id){
   pagination[table_id] = data;

   if(pagination[table_id].next_page_url == null){
        paginate = false;
   } 

   debug == true ? console.log('Pagination Data', pagination[table_id]) : false;
}

功能。

{
 "total":6159,
 "per_page":100,
 "current_page":2,
 "last_page":62,
 "next_page_url":"localhost/pagination?page=2",
 "prev_page_url":null,
 "from":101,
 "to":200,
 "data":[{REMOVED}]
}

初始页面加载的对象数据如下所示。

function searchTable(table_config){
    searched = true;

    var search_id     = table_config.table.id+'_search';
    var search_box    = document.getElementById(search_id);
    var search        = search_box.value;
    var table_header  = document.getElementById(table_config.table.id + '_head');
    var table_headers = table_header.firstElementChild.children;


    // Get columns that are searchable
    var search_fields = get_searchable(table_headers);

    var filters = get_column_filters(table_config);

    var post = {
        "_token": $('meta[name="csrf-token"]').attr('content'),
        "search": search,
        "search_fields" : search_fields,
        "filters" : filters,
    };

    debug == true ? console.log('Search:', search, 'Filters:', filters) : false;


    dimTable(table_config.table.id);

    page_data = post;

    var search_url = addSlash(current_url) + table_config.table.urls.search;

    $.post(search_url, post, function(data){
        debug == true ? console.log('Data returned from search:', data) : false;

        clearTableBody(table_config.table.id);
        setPaginationData(data, table_config.table.id);
        populateTable(data.table, table_config);
        getNextPage(table_config);
    });
}

当我运行搜索过滤器时。我从AJAX请求返回一个新的分页对象,并使用上面的函数进行设置。

{
 "total":186,
 "per_page":100,
 "current_page":1,
 "last_page":2,
 "next_page_url":"localhost/search?page=2",
 "prev_page_url":null,
 "from":1,
 "to":100,
 "data":[{REMOVED}]
}

我返回的“data”对象与页面加载期间的原始对象完全相同,但它是不同的数据。

function getNextPage(table_config){
    debug == true ? console.log('Getting next page of pagination', table_config, pagination[table_config.table.id]) : false;
    checkSort(table_config.table.id); 

    if(pagination[table_config.table.id].current_page < pagination[table_config.table.id].last_page){
        loadingData(table_config.table.id, true);
        var page = pagination[table_config.table.id].current_page + 1;
        var page_url = addSlash(current_url) + table_config.table.urls.pagination + '?page=' + page;

        $.post(page_url, page_data, function(data){
            setPaginationData(data, table_config.table.id);
            // pagination[table_config.table.id] = data;
            loadingData(table_config.table.id, false);
        });
    }
}

function loadingData(table_id, check) {
    if(check == true){
        downloadingData = true;

        $('.'+table_id+'_loading_data').show();
    } else {
        downloadingData = false;
        $('.'+table_id+'_loading_data').hide();
    }
}

那么为什么当我运行我的函数来获取下一页数据时,它会使用对象上设置的原始值而不是刚从搜索中设置的值?

fid = fopen('/path/to/file');
line = fgetl(fid);
out = struct();
while ischar(line)
    res = regexp(line, '\{([^\}]+)\}','tokens','once');  %// remove {} from line
    if isempty(res)
       continue;  %// empty line?
    end
    res2 = regexp(res{1},'"([^"]+)"\s*:\s*([^,]+),?', 'tokens');  %// get the key-value pairs
    for ii=1:numel(res2)
        if isfield(out, res2{ii}{1})
           out.(res2{ii}{1}){end+1} = str2double(res2{ii}{2});
        else
           out.(res2{ii}{1}) = {str2double(res2{ii}{2})};
        end
    end
    line = fgetl(fid);
end
fclose(fid);

我的searchTable函数不应该将我的对象中的数据设置为来自AJAX调用的新值吗?

1 个答案:

答案 0 :(得分:0)

在您的函数 getNextPage()中,您对服务器进行调查后检索数据。

您已经在函数 searchTable()中完成了新的分页数据。

回到 getNextPage(),你传递变量 page_data ,这是全局的,永远不会改变。

也许在这部分你会找回原始的分页对象并重置它。