如何动态设置模板字符串?

时间:2016-10-17 21:59:56

标签: dojo

在Dojo 1.10+中有没有办法动态设置基于模板的小部件的templateString?

例如我尝试了类似这样的事情

...
return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {

templateString: undefined,

constructor: function(myTemplate){
    var that = this;

    //set the template
    require(["dojo/text!" + myTemplate], function (template) {
        that.templateString = template;
    });
}
...

但是不成功,templateString总是未定义的,所以它崩溃了404错误,因为它无法找到html文件。

这甚至可能吗?

1 个答案:

答案 0 :(得分:3)

如果只能设置一组有限的模板,您可以使用以下内容:

define([
    "dojo/_base/declare",
    "dijit/_TemplatedMixin",
    "dojo/text!path_to_template1.html",
    "dojo/text!path_to_template2.html"
], function(declare, _TemplatedMixin, template1, template2)
{
    return declare([_TemplatedMixin],
    {
        templateToUse: 1,

        constructor: function(params)
        {
            this.templateToUse = params.templateToUse;
        },

        buildRendering: function()
        {
            switch(this.templateToUse) {
                case 2:
                    this.templateString = template2;
                    break;
                case 1:
                    this.templateString = template1;
                    break;
                default:
                    this.templateString = template1;
            };

            this.inherited(arguments);
        }
    }
}

我不得不问这是什么用例,因为我可以看到几种可能更好的替代方案。

  • 如果模板明显不同,为什么不创建单独的小部件?您可以使用dojo提供的OOP或mixin技术来共享它们之间的功能。
  • 可以使用传递给窗口小部件构造函数的参数高度自定义单个模板。您可以将不同的元素附加到dojo附加点,甚至可以通过将display:none样式设置为隐藏某些元素来隐藏它们。