如何使用 AngularJS 在 Kendo Grid Column Template 中使用函数

Posted

技术标签:

【中文标题】如何使用 AngularJS 在 Kendo Grid Column Template 中使用函数【英文标题】:How to use function in Kendo Grid Column Template with AngularJS 【发布时间】:2014-07-31 15:10:53 【问题描述】:

我在 Kendo 网格中有一个列,我想在渲染时执行一些特定的逻辑,并且正在使用 Angular。我使用 k-columns 指令设置了网格列。

在查看the documentation 之后,似乎很简单:我可以将模板选项添加到我的列中,定义执行我的逻辑的函数,并将 dataItem 值传入。我所拥有的看起来像这样:

k-columns='[ field: "Name", title: "Name", 
    template: function (dataItem)
        // Perform logic on value with dataItem.Name
        // Return a string
    
]'

但是,运行它会导致语法错误,抱怨字符“”在我的函数中形成了块的开头。

我见过几个以这种格式定义模板函数的例子。是否需要做其他事情才能使其正常工作?我做错了什么吗?是否有另一种将模板定义为函数并将列数据传递给它的方法? (我尝试在我的 $scope 上创建一个函数,但我无法弄清楚如何将数据传递给函数。)

感谢您的帮助。

【问题讨论】:

【参考方案1】:

在使用 AngularJS 和 Kendo 时,似乎不支持以这种方式定义列模板。这种方法适用于不使用 Angular(标准 MVVM)的项目,但由于包含它而失败。

我的一位同事发现的解决方法是使用 ng-bind 构建模板,以在 $scope 上指定模板函数,全部在 span 内:

template: "<span ng-bind=templateFunction(dataItem.Name)>#: data.Name# </span>"

这是 Telerik 在其 Kendo-Angular 源代码中实现的默认列模板方法。我还不知道是否需要 data.Name 值,但这对我们有用。

【讨论】:

有一个更简单的解决方法 - 只需访问范围并使用 dataItem 就像 template: "&lt;span&gt; dataItem.Name &lt;/span&gt;", 一样 @jajdoo - 您的示例中自定义函数在哪里运行?【参考方案2】:

警告:目前无法访问 Kendo 来测试代码,但这应该非常接近

在您的情况下,您正在为 k-columns 的值分配一个字符串,并且该字符串包含单词 function 和大括号

你需要确保函数被执行......像这样:

k-columns=[
    
       field: "Name",
       title: "Name", 
       template: (function (dataItem)
        // Perform logic on value with dataItem.Name
        // Return a string
       ())
    
];

注意区别:

我们创建一个对象 -- 一个真正诚实的对象,我们使用 IIFE 来填充 template 属性。

【讨论】:

感谢您的意见。这是一个很好的主意,但它似乎不起作用:我得到了和以前一样的错误。我注意到几件事:A)函数调用括号应该在结束函数定义括号之后,B)我不确定为什么需要这种格式,因为 Telerik 的文档没有使用它。他们只是将模板本身定义为一个函数。 虽然情况有所好转,但我发现 Telerik 的文档经常......缺乏。 (并且调用括号的位置无关紧要,它只是一个偏好。(function() ())(function() )() 完全相同。 您正在调用一个函数,该函数需要一个参数 (dataItem) 而没有提供它。如果将模板指定为函数(函数定义后不带 ()),kendo 将为数据源中的每个项目调用此函数,并提供当前项目作为参数。 当您需要用于具有相同功能的多个列时,您不能使用您的功能。问题是哪一列在调用这个函数 模板函数回调不需要自己调用。 template: function(dataItem) /* do something with dataItem.Name */ 就足够了。【参考方案3】:

也许,它对某人有用 - 这段代码也适用于我:

columns: [
  
    field: "processed",
    title:"Processed",
    width: "100px",
    template: '<input type="checkbox" ng-model="dataItem.processed" />'
  ,

你会得到这样的双向绑定:

<div class="col-md-2">
  <label class="checkbox-inline">
    <input type="checkbox" ng-model="vm.selectedInvoice.processed">
    processed
  </label>
</div>

【讨论】:

【参考方案4】:

这可以通过columns.template 参数通过提供一个回调函数来完成,该函数的参数是一个代表行的对象。如果您为该行提供一个名为 name 的字段,这将是您引用的对象的属性:

$("#grid").kendoGrid(
  columns: [ 
    field: "name",
    title: "Name",
    template: function(data) 
        return data.name + "has my respect."
    
  ],
  dataSource: [  name: "Jane Doe" ,  name: "John Doe"  ]
);

更多信息请访问Kendo's columns.template reference page。

【讨论】:

【参考方案5】:

经过数小时的搜索。这是有效的结论: 以 dataItem.masterNoteId 的形式访问您的网格数据,并以属性名称或函数的形式访问您的 $scope 数据。

例子

template: '<a href="\\#/ops/order/orderId/note/dataItem.masterNoteId"><i class="fa fa-edit"></i></a>',

我真的希望这能保护别人的生命:)

【讨论】:

以上是关于如何使用 AngularJS 在 Kendo Grid Column Template 中使用函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kendo UI 和 AngularJS 创建基本数据网格

使用 angularjs 在 kendo 调度程序上自定义删除确认弹出窗口

通过 AngularJS 中的模型绑定更改 Kendo 图表类型

用于 Kendo UI 移动的 AngularJS 路由

kendo ui AngularJS Grid CRUD操作

AngularJS:Kendo 单击/点击时清除所有 0 的 NumericText 框