【问题标题】:Swapping data in Angular UI-Grid, new columns not visible when changing dataset externally在 Angular UI-Grid 中交换数据,在外部更改数据集时新列不可见
【发布时间】:2015-05-29 18:47:21
【问题描述】:

我有一个我一直在研究的查询工具,它有一个已填写的角度表单,然后在提交时使用 AJAX 返回 JSON,然后将其呈现为 ui-grid,即 JSON响应看起来像

{
"success": true,
"message": "",
"columns": ["first_name", "last_name", "company", "employed"]
"results": [
    {first_name: "John", last_name: "Smith", company: "Abc Inc", employed: true},
    {first_name: "Johnny", last_name: "Rocket", company: "Abc Inc", employed: true}]
}

我正在研究 PHP 和 Angular,因此如果需要,我可以完全控制这个 JSON 响应。当呈现来自第一个 AJAX 调用的 JSON 响应时,我遇到了一个问题,然后我在同一页面上运行另一个单独的 AJAX 调用并获取新数据集:这个新数据集不会呈现任何不在原始数据集中的列。这是一个很大的问题,因为当所有列都不相同时,表格基本上被清除了,而且我经常需要在这个单页应用程序中将完全不同的数据加载到 ui-grid 中。

收到 JSON 后,我只需将 jsonResult.results 绑定到 ui-grid 绑定到的旧 $scope.myData 变量。

我已经 a plunker 隔离了这个问题。加载具有“朋克”列的数据集,然后单击“交换数据”将尝试加载具有“员工”列而不是“朋克”的数据集。到目前为止,我已经研究了在 $scope.myData 变量使用 $watch 更改时将刷新或重新加载的指令,并寻找类似 $scope.columnDefs 的东西来让 ui-grid 知道。 Angular 和 javascript 相对较新,所以指令仍然让我有点头疼。

【问题讨论】:

    标签: javascript ajax angularjs angular-ui angular-ui-grid


    【解决方案1】:

    我已经稍微更新了你的 plunker:

    $scope.swapData = function() {
      if ($scope.gridOpts.data === data1) {
        $scope.gridOpts.columnDefs = [
          { name:'firstName' },
          { name:'lastName' },
          { name:'company' },
          { name:'employee' }
        ];
        $scope.gridOpts.data = data2;
        //punk column changes to employee
      }
      else {
        $scope.gridOpts.columnDefs = [
          { name:'firstName' },
          { name:'lastName' },
          { name:'company' },
          { name:'punk' }
        ];
        $scope.gridOpts.data = data1;
        //employee column changes to punk
      }
    };
    

    http://plnkr.co/edit/OFt86knctJxcbtf2MwYI?p=preview

    由于您的 json 中有列,所以应该很容易做到。

    【讨论】:

    • 这确实改变了列标题!它最初并没有完全加载数据,但“添加数据”按钮有效,所以我将使用 for 循环和push 来获取新数据!
    • 是的,我只是做了一个最小的改变。如果你愿意,我可以更新它以使用更接近你的 json 的对象。
    • 主要是我加载了第二个数据集,我有done this so far,它正在循环并记录到控制台,但还没有更改源数据集
    • 这样当应用新数据时,它会立即显示在网格中
    • 我看到我没有雇用员工,所以最后一列没有加载,我解决了这个问题。我看了看你正在采取的方法,你正朝着一个糟糕的方向前进(当我第一次开始这样做时,我走的是同一条路)。再看看我的 plunker 示例。
    【解决方案2】:

    我在 Kevin Sage 的回答和 plunker 示例的帮助下发现了一个额外的部分...如果您使用向后兼容的“字段”属性,则当字段名称之间存在重叠时,交换无法正常工作两组列定义。在这种情况下,列标题和列宽不会正确呈现。使用列定义的“名称”属性可以纠正这个问题。

        $scope.swapData = function() {
      if ($scope.gridOpts.data === data1) {
        $scope.gridOpts.columnDefs = [
          { field:'firstName' },
          { field:'lastName' },
          { field:'company' },
          { field:'employee' }
        ];
        $scope.gridOpts.data = data2;
        //punk column changes to employee
      }
      else {
        $scope.gridOpts.columnDefs = [
          { field:'firstName' },
          { field:'lastName' },
          { field:'company' },
          { field:'punk' }
        ];
        $scope.gridOpts.data = data1;
        //employee column changes to punk
      }
    };
    

    此处示例:Plunker

    【讨论】:

    • 是的 - 使用字段时完全中断。诡异的!也许field毕竟不是那么向后兼容
    • 看起来今天对 ui-grid 脚本所做的更改实际上已经解决了这个问题。上面的 plunker 今天下午开始正常运行。
    • ui-grid 这样真的很酷。过去几个月我遇到的问题已经不是第一次发生了。
    【解决方案3】:

    我的解决方案:

    $http.get('url').success(function(res) {
    // clear data
    gridOptions.data.length = 0;
    // update data in next digest 
    $timeout(function() {
    gridOptions.data = res;
    });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-12
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多