2016-09-19 60 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来证明这一点将有助于这种情况。