【问题标题】:How to set the scope of `this`on Kendo UI's autocomplete template?如何在 Kendo UI 的自动完成模板上设置 `this` 的范围?
【发布时间】:2015-02-24 00:58:09
【问题描述】:

Kendo UI 的template API 允许您在template 中使用JavaScript。这对于自定义autocomplete template 很有用。

生成的代码运行时,this 的作用域为Window object。我想将范围设置为自动完成实例,例如,使用_prev 值来自定义结果。

在此demo code上,要将substring上的客户名称color更改为红色,相当于搜索文本,您可以在template代码中搜索autocomplete实例。在给定的示例中,只需将 template 属性更改为

 template: 
    '<span class="k-state-default"><img src= \"../content/web/Customers/#:data.CustomerID#.jpg\" alt=\"#:data.CustomerID#\" /></span>' +
    '<span class="k-state-default">'+
    '# var searchText= $("\\#customers").data("kendoAutoComplete")._prev; #'+
    '# data.coloredName= '+
        '"<span style=\\"color:red;\\">"  '   +
         '+ data.ContactName.substring(0, searchText.length) +'   +
         '"</span>" + data.ContactName.substring(searchText.length);  #'+
        '<h3>#= data.coloredName #</h3>'+
        '<p>#: data.CompanyName #</p>'+
    '</span>',

但是,如果我不能使用$()“搜索”,我想通过设置模板生成的函数的范围来做到这一点。有可能吗?

【问题讨论】:

  • 除非您完全负责呼叫代码,否则this 将是任何代码。您最好的选择可能是在您尝试编写的代码范围内的某处保留对自动完成实例的引用。
  • 保留对Window 对象的引用是不可取的,因为我的案例是一个可重用的组件。
  • 我不明白。我没有提到Window 对象。
  • 默认情况下,this 的范围是Window 对象,在模板生成的代码执行期间唯一可用的对象是data,它引用自动完成@987654342 的每个项目@。它们都不是存储对autocomplete 实例的引用的好地方。
  • 我想你误解了“范围”这个词,它不是“这个”的同义词。无论如何,我不会费力,因为您已经接受了一个大致符合我想法的答案。

标签: javascript jquery kendo-ui kendo-template kendo-autocomplete


【解决方案1】:

有可能:

var autocomplete = $("#customers").kendoAutoComplete({
   // standard options, not the template
}).data("kendoAutoComplete");

var templateHtml = 'your template html using "this" here ...';
// compile the template from the html
var compiledTemplate = kendo.Template.compile(templateHtml);
// bind the template function to whatever you want, e.g. the autocomplete
var boundTemplate = compiledTemplate.bind(autocomplete);
//  set the template on the widget
autocomplete.setOptions({
    template: boundTemplate
});

(demo)

请注意,您在上下文中可能拥有的任何属性都将被传递给模板的数据覆盖,因此您无法从外部范围访问这些属性(请参阅模板函数的结构here)。

【讨论】:

  • updated the demo 根据您的解决方案,从thisautocomplete 对象的引用中获取搜索文本,而不是$("\\#customers").data("kendoAutoComplete")。但是您的解决方案是正确的。谢谢!
  • 对,我没注意;很高兴我能帮上忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多