【问题标题】:Working on templates for columns in kendo grid处理剑道网格中的列模板
【发布时间】:2016-05-11 14:26:53
【问题描述】:

我一直在尝试在 kendoGrid 中某个字段的模板中使用 if 和 else。我有两个字段“StatusDesc”和“newStatusDesc”。我想将其中一个值显示为锚标记。这显示得很好,但是如果您注意到为锚标记定义了 onclick,它具有来自网格本身的一个字段,因为它必须打开另一个页面但是当我单击锚标记时,我的浏览器控制台显示:

未捕获的 ReferenceError:未定义 WEW6101

实际上,如果我检查 firebug,它会显示以下值设置为我的锚标记参数,这是正确的,但我无法调用函数“WEW6101”

onclick='openStatusReload(WEW6101)

  $("#Grid").kendoGrid({
        dataSource: TUEDataSource,
        autoBind: false,
        scrollable: false,
        sortable: {
            allowUnsort: false
        },
        //filterable: { mode: "row", style: "max-width:100px;" },
        //groupable: true,
        pageable: {
            refresh: true,
            buttonCount: 5,
            pageSizes: 5
        },
        dataBound: gridDataBound,
        columns:
            [
                { field: "newStatusDesc", hidden: true },
            { field: "StatusDate", title: "Status Date", width: 200, format: "{0:MM/dd/yyyy}", filterable: { cell: { showOperators: false, suggestionOperator: "contains" } } },
            { field: "Status", title: "Status", width: 150, filterable: { cell: { showOperators: true } } },
            { field: "LimitedDate", title: "Expiration Date", format: "{0:MM/dd/yyyy}", width: 150, filterable: { cell: { showOperators: true } } },
            {
                field: "StatusDesc", title: "Comments", width: 150,
                template: "#if(StatusDesc == '' && newStatusDesc!='' && newStatusDesc!= null  ) {#<a href='javascript:void(0)' class='margin-right10' onclick='openStatusReload(#=newStatusDesc#)'> #:newStatusDesc#</a>#} else{##:StatusDesc##}#", filterable: { cell: { showOperators: true } }
                // template: "<a href='javascript:void(0)' class='margin-right10' onclick='openPlayerTUEStatusReload(#=Tue_StatusDesc#)'>#=TueStatusDesc#</a>", filterable: { cell: { showOperators: true } }
            },
            ]
    });

【问题讨论】:

  • 您尝试执行的操作有点令人困惑,但看起来好像您正在尝试在单击链接时将newStatusDesc 的内容传递给openStatusReload() 调用。 newStatusDesc 似乎设置为字符串“WEB6101”。如果您的意图是将字符串“WEB6101”传递给 openStatusReload 函数调用,您需要将该值括在引号中,否则 JavaScript 将查找名为 WEB6101 的变量,该变量似乎不存在。我想你想要这个:onclick='openStatusReload(\"#=newStatusDesc#\")'.
  • 你帮了很多忙。非常感谢你,但是怎么知道这些关键字 (\"#=sometext#\" 会把一个东西变成字符串?虽然我用过它,但是这些词告诉浏览器什么。我们有这些列表吗?关键字,以便在以后的工作中记住它?
  • 我认为您可能只是对 Kendo 处理模板的方式感到困惑。 Kendo 将在磅字符# 之间获取任何内容并将其作为 JavaScript 处理。因为您在单个字符串中构建整个模板(由双引号括起来),所以您需要转义该字符串中的任何双引号。这就是我使用\" 的原因。最终生成的 onclick 内容最终将是 openStatusReload("CONTENTS_OF_sometext"),用简单的英语读作“调用 openStatusReload 函数并传入字符串 'CONTENTS_OF_sometext'”。

标签: javascript asp.net-mvc-3 kendo-ui kendo-grid kendo-asp.net-mvc


【解决方案1】:

根据@Quantastical 的评论,您缺少文本周围的引号,这是导致问题的原因,但以下答案可能有助于解决此问题以及您需要使用剑道网格的任何未来templating

我觉得这个道场可以帮到你:http://dojo.telerik.com/AVeBU

我发现像这样进行内联模板可能很困难,因此更愿意将方法提取出来并使用 kendo 提供的模板引擎或像您所做的那样制作 html。

我已对您的专栏进行了以下更改,因此根据您提供的内容:

 { field: "StatusDesc", title: "Comment", width: "130px" ,
   template: "#=generateLink(data)#" }

在这里,我将行的 dataItem 传递给一个名为 generateLink 的函数,该函数调用此代码:

function generateLink(data) {
  var ret = '';

  if (data.StatusDesc === '' && data.newStatusDesc !== '' && data.newStatusDesc !== null) {

    var linkElement = 'openStatusReload("' + data.newStatusDesc + '")';

    ret = "<a href='javascript:void(0)' class='margin-right10' onclick='" +
           linkElement + "'>" + data.newStatusDesc + '</a>';

    console.log(ret);

  } else {
    ret = data.StatusDesc;
  }

  return ret;
}

所有这一切都是应用与您相同的逻辑,但允许您使用 native javascript 而不是 kendo 小部件必须使用 #= {some javascript in here} # 来解释突破

这样,如果您需要修改代码,则更易于阅读和更改,而不必弄清楚可能缺少哪个#。

在我的示例中,我的代码只是弹出一个警报框,其中包含传入的值并登录到控制台,因此您可以看到正在发生的magic

希望这会有所帮助,但如果您有任何更改/解释更好地告诉我,我会相应地更新我的答案。

【讨论】:

  • 我认为您的评论过于明确和明确。因此,我向 OP 提出了针对他的开场问题的不同解决方案。我会更新我的答案以反映您的评论。
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多