Knockout.js 自定义绑定处理程序,从字符串模板呈现绑定

Knockout.js 自定义绑定处理程序,从字符串模板呈现绑定,knockout.js,ko-custom-binding,Knockout.js,Ko Custom Binding,我正在使用一个行模板创建一个自定义绑定,该模板应该是可选的。如果用户不提供模板id,我想使用默认的模板id,但它不在主体中的脚本标记中,它只是options文本上的一个字符串 如何使用字符串作为模板 默认模板应该非常简单,比如 <span data-bind="text: name"></span> var engines: {} var renderTemplate = function (element, template, data, bindingContext

我正在使用一个行模板创建一个自定义绑定,该模板应该是可选的。如果用户不提供模板id,我想使用默认的模板id,但它不在主体中的脚本标记中,它只是options文本上的一个字符串

如何使用字符串作为模板

默认模板应该非常简单,比如

<span data-bind="text: name"></span>
var engines: {}
var renderTemplate = function (element, template, data, bindingContext) {
    var engine = engines[template];

    var success = false;
    do {
        try {
            ko.renderTemplate(template, bindingContext.createChildContext(data), engine, element, "replaceChildren");
            success = true;
            engines[template] = engine;
        } catch(err) {
            if (engine != null)
                throw "Template engine not found";

            engine = { templateEngine: stringTemplateEngine };
        }

    } while (!success)
};
更新 刚刚收到关于这个问题的通知,看到有人建议将模板注入dom并使用标准脚本标记提供程序。但这并没有考虑到用户可以覆盖默认模板源(单个plage应用程序的常见场景)。我使用这种方式,首先尝试默认模板提供程序,然后像这样回退到字符串模板源

<span data-bind="text: name"></span>
var engines: {}
var renderTemplate = function (element, template, data, bindingContext) {
    var engine = engines[template];

    var success = false;
    do {
        try {
            ko.renderTemplate(template, bindingContext.createChildContext(data), engine, element, "replaceChildren");
            success = true;
            engines[template] = engine;
        } catch(err) {
            if (engine != null)
                throw "Template engine not found";

            engine = { templateEngine: stringTemplateEngine };
        }

    } while (!success)
};
完整代码和stringTemplateEngine代码可在此处找到

要从字符串呈现模板,您需要编写一个自定义模板源,如下所述


希望这能有所帮助。

只是澄清一下,模板本身,而不是模板的名称,存在于字符串中,对吗?谢谢,将尝试该解决方案。他不能用jQuery.html()将字符串注入DOM吗?这似乎更容易。完全是这样。但我得到的印象是他不想这样。如果你问我这更好…从定制绑定中工作非常好。这最好和最小的用法没有包含在文章中,可以在评论中找到