在ui-grid中,我想为colDef的field属性使用一个函数。如何将另一个函数作为参数传递给它?

时间:2015-10-28 18:52:26

标签: angularjs angular-ui-grid

配置Angular ui-grid时,为每个列定义指定字段。您可以使用字符串指向row.entity中的右侧字段,也可以使用函数。有关如何:https://github.com/angular-ui/ui-grid/issues/723

的快速摘要,请参阅此github问题

使用函数指定字段时,我可以将字符串,对象和数组作为参数传入。但是出于某种原因,当我传递另一个函数时,它不起作用。实际上,定义字段的主要功能似乎根本不执行。

显示两个表的

Here is a plunkr。顶部列出名称和年龄,然后使用函数将第二列中的两个组合在一起。只要你传入一个字符串(在这种情况下,在年龄之后的单词“years”),它就可以正常工作。底部表格显示了它返回返回“年”的辅助函数的情况。 field: getNameAndAgeFunction(function(){return " years";})

在第二种情况下,getNameAndAgeFunction()似乎永远不会执行,并且单元格保持为空。我知道如何传递函数吗?更好的方法是从控制器的范围传递该函数。非常感谢!

这是JS:

var app = angular.module('myApp', ['ui.grid']);
app.controller('MyCtrl', function($scope) {
    $scope.myData = [
             {name: "Moroni", age: 50},
                     {name: "Tiancum", age: 43},
                         {name: "Jacob", age: 27},
                         {name: "Nephi", age: 29},
                         {name: "Enos", age: 34 }];

        angular.forEach($scope.myData,function(row){
          row.getNameAndAgeString = function(units){
            return this.name + '-' + this.age + units;
          }
        });
        angular.forEach($scope.myData,function(row){
          row.getNameAndAgeFunction = function(fx){
            return this.name + '-' + this.age + fx();
          }
        });

    $scope.getUnits = function(){return " years"};

    $scope.gridOptionsString = { 
        data: 'myData',
        columnDefs: [{field: 'name', displayName: 'Name'},
                     {field:'age', displayName:'Age'},
                     {field: 'getNameAndAgeString(" years")', displayName: 'Name and age'},
                     ]
        };

    $scope.gridOptionsFunction = { 
        data: 'myData',
        columnDefs: [{field: 'name', displayName: 'Name'},
                     {field:'age', displayName:'Age'},
                     {field: 'getNameAndAgeFunction(function(){return " years";})', displayName: 'Name and age'},
                     ]
        };
});

2 个答案:

答案 0 :(得分:0)

这是由于gridUtil.preEval函数准备了你在字段属性中输入的字符串。

它转换:

  • foo.bar to foo ['bar']
  • foo.bar(arg)to foo'bar'
  • foo.bar(function(){...})to foo ['bar(function(){}']

最后一个是你的情况,但结果字符串似乎无法评估给我(使用角度$parse方法)。

我正在寻找它,它看起来像一个像最后一个字符串的字符串:

foo.bar(function() {...})

$parse方法不兼容。

我建议您使用自定义单元格模板,您仍然无法在角度表达式中使用嵌套函数(带有大括号{{...}}的那些)但您可以访问更多变量如:

  • grid.appScope:网格所在的范围。
  • row:具有自定义模板的单元格行,row.entity可以访问实体值。
  • col:具有自定义模板的单元格列,col.colDef可以访问列定义

您可以看到更多here,我编辑了您的plunker以使用此here

答案 1 :(得分:0)

所以,我正在查看OP中链接的帖子中的plunkr,并且几个脚本链接被破坏了,所以这里是与那些已修复的链接的直接链接:http://plnkr.co/edit/jAyqrKZ6gGa4Xrp7NRsq?p=preview

我说我喜欢它的工作原理,使用字段属性中的函数字符串。但是,我不想将这个功能添加到每一行数据中,特别是如果有1000行的话。

    angular.forEach($scope.myData,function(row){
      row.getNameAndAge = function(){
        return this.name + '-' + this.age;
      }
    });

我还没有找到如何使用匿名函数执行此操作,但这对我来说看起来更干净。