2016-09-19 8 views
2

Вот краткий обзор проблемы: я настроил столбец sortChange(), который реагирует на изменения сортировки, отключив запрос, чтобы получить новые отсортированные данные. Я сохраняю состояние сетки перед извлечением и восстанавливаю состояние сетки после извлечения. Проблема в том, что механизм gridState восстановления запускает первоначальный прослушиватель сортировки, заставляя весь процесс запускаться снова и снова и снова.UI-grid saveState сервисная круговая логика

scope.sitesGrid.onRegisterApi = function(gridApi) { 
    scope.gridApi = gridApi; 

    scope.gridApi.core.on.sortChanged(scope, function() { 
    // load new sites on a sort change 
    scope.initialize(); 
    }); 
}; 

scope.initialize = function() { 
    // save current grid state 
    scope.gridApi && (scope.gridState = scope.gridApi.saveState.save()); 

    fetchSites().then(function (sites) { 
    scope.sitesGrid.data = sites 
    // restore current grid state, but inadvertently retrigger the 'sortChanged' listener 
    scope.gridApi.saveState.restore(scope,scope.gridState); 
    }) 
}; 

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

ответ

1

Как насчет какой-либо переменной области для отслеживания загрузки данных?

scope.gridApi.core.on.sortChanged(scope, function() { 
    if (!scope.isLoading) { 
     scope.initialize(); 
    } 
}); 

и

fetchSites().then(function (sites) { 
    scope.isLoading = true; 
    scope.sitesGrid.data = sites; 
    scope.gridApi.saveState.restore(scope,scope.gridState); 
    scope.isLoading = false; 
}) 

Вам может понадобиться, чтобы добавить некоторые timeout() звонки в местах, если есть временные проблемы с этим. Создание Plunker для демонстрации этого поможет в этом случае.