在什么范围 kendo 中执行模板?
What scope kendo templates are executed in?
我有一个这样的 kendo 模板:
<script id="rowTemplate" type="text/x-kendo-tmpl">
<tr data-uid="#: uid #" role="row">
<td role="gridcell">#= kendo.toString(kendo.parseDate(WhenDate, 'yyyy-MM-dd'), 'dd MMM yyyy') #</td>
<td role="gridcell">#= Activity #</td>
<td role="gridcell">#= Description #</td>
<td role="gridcell">#if (isButtonShown(Activity)){# #= editTemplate # #}#</td>
<td role="gridcell">#if (isButtonShown(Activity)){# #= delTemplate # #}#</td>
</tr>
</script>
可以看到调用了isButtonShown
函数。我能做到这一点的唯一方法是将 isButtonShown
函数放在全局范围内,显然,我想避免这种情况。我在哪里可以定义这个函数,以便在编译模板时可以使用它(除了全局范围)?
同样的问题适用于 editTemplate
和 delTemplate
,它们目前也是全局定义的,因此它们对模板可见。
WhenDate
、Activity
和 Description
都是来自 kendo 网格绑定到的数据源的实体的属性。
以下是模板在 javascript 中的引用方式:
$("#grid").kendoGrid({
rowTemplate: kendo.template($("#rowTemplate").html()),
....
除了将其放在全局范围内之外,我不确定是否可行。
您能否在将数据绑定到网格之前循环遍历数据并根据 Activity 设置 属性 'isButtonShown'?那么只需在模板中检查 属性 而不是调用函数即可。
您可以在控制台中使用以下代码自行测试:
kendo.template('#debugger#')({x:1});
然后你的浏览器应该进入编译后的模板函数,看起来像这样:
(function(data
/**/) {
var o,e=kendo.htmlEncode;with(data){o='';debugger;o+='';}return o;
})
当你的模板运行时,data
是传入的对象{x:1}
,this
是window
。
最简单的做法是让您的函数在全局范围内可访问,但也可以将其放在命名空间对象中,例如 app.utils.isButtonShown
尽管可以理解,您可能不想污染全局范围。您作为 data
传递的对象(显示在您的网格中的项目)可能在 DataSource
中,因此您可以重复调用 .parent()
以遍历可观察的层次结构。这可能会将您带到可以添加功能的地方。
我有一个这样的 kendo 模板:
<script id="rowTemplate" type="text/x-kendo-tmpl">
<tr data-uid="#: uid #" role="row">
<td role="gridcell">#= kendo.toString(kendo.parseDate(WhenDate, 'yyyy-MM-dd'), 'dd MMM yyyy') #</td>
<td role="gridcell">#= Activity #</td>
<td role="gridcell">#= Description #</td>
<td role="gridcell">#if (isButtonShown(Activity)){# #= editTemplate # #}#</td>
<td role="gridcell">#if (isButtonShown(Activity)){# #= delTemplate # #}#</td>
</tr>
</script>
可以看到调用了isButtonShown
函数。我能做到这一点的唯一方法是将 isButtonShown
函数放在全局范围内,显然,我想避免这种情况。我在哪里可以定义这个函数,以便在编译模板时可以使用它(除了全局范围)?
同样的问题适用于 editTemplate
和 delTemplate
,它们目前也是全局定义的,因此它们对模板可见。
WhenDate
、Activity
和 Description
都是来自 kendo 网格绑定到的数据源的实体的属性。
以下是模板在 javascript 中的引用方式:
$("#grid").kendoGrid({
rowTemplate: kendo.template($("#rowTemplate").html()),
....
除了将其放在全局范围内之外,我不确定是否可行。
您能否在将数据绑定到网格之前循环遍历数据并根据 Activity 设置 属性 'isButtonShown'?那么只需在模板中检查 属性 而不是调用函数即可。
您可以在控制台中使用以下代码自行测试:
kendo.template('#debugger#')({x:1});
然后你的浏览器应该进入编译后的模板函数,看起来像这样:
(function(data
/**/) {
var o,e=kendo.htmlEncode;with(data){o='';debugger;o+='';}return o;
})
当你的模板运行时,data
是传入的对象{x:1}
,this
是window
。
最简单的做法是让您的函数在全局范围内可访问,但也可以将其放在命名空间对象中,例如 app.utils.isButtonShown
尽管可以理解,您可能不想污染全局范围。您作为 data
传递的对象(显示在您的网格中的项目)可能在 DataSource
中,因此您可以重复调用 .parent()
以遍历可观察的层次结构。这可能会将您带到可以添加功能的地方。