gpt4 book ai didi

javascript - 使用 Jurassic 预编译 JsRender 模板服务器端

转载 作者:行者123 更新时间:2023-11-29 15:38:35 25 4
gpt4 key购买 nike

我正在尝试从用 C# 编写的类库中预编译 JsRender 模板,使用 Jurassic 脚本引擎来执行 JsRender。

这是我的代码:

var engine = new Jurassic.ScriptEngine();
engine.Execute(JsRenderContents);
var precompiledTemplate = engine.CallGlobalFunction<string>(String.Concat("$.templates(\"", template, "\");"));

我从 this page 获取了 JavaScript 函数调用 $.templates()其中指出

$.templates(markupOrSelector) returns: Compiled template object

我的示例 HTML 模板很简单

<li>{{:Name}}</li>

但是,我的代码产生了异常:

'$.templates("<li>{{:Name}}</li>");' is not a function.

现在,我不是 100% 清楚是否可以在没有 jQuery 的情况下使用 $ 运算符。作者在他的几个示例中包括了 jQuery,但也声明不需要 jQuery。

那么怎么了?在我发布此问题的同一天,从 GitHub 获取的 JsRender 版本的文档是否已过时? (我知道 JsRender 仍处于测试阶段。)或者我在滥用 Jurassic?

编辑:

我相信这实际上是一个 Jurassic 问题而不是 JsRender 问题。具体来说,我认为这与 Jurassic 的全局对象有关,因为 JsRender 被包装在传递 this 的立即调用函数中,我不确定 Jurassic 是否提供了 this

看来我不是第一个面对这个问题的人。我采纳了上一篇关于 this page 的帖子的建议并将我的代码更改为以下内容:

var engine = new Jurassic.ScriptEngine();
engine.Execute(JsRenderContents);
engine.Global["window"] = engine.Global;
var precompiledTemplate = engine.CallGlobalFunction<string>(String.Concat("window.jsviews.templates(\"", template, "\");"));

这没有用 - 可能是因为 JsRender 的 IIF 仍然传递 this 而不是 window,我不想修改脚本。

任何人都可以帮助插入这一进程吗?我如何从 Jurassic 调用任何 JsRender 函数,鉴于 Jurassic...我不知道...也许 Jurassic 实现全局对象的方式在概念上有所不同。

最佳答案

我正在使用 jsRender + Jurassic 预编译我的模板并在 T4 中生成 js 文件。我花了很多时间解决这个问题,但没有找到答案,但阅读了一些文章,这很有帮助。

查看我的代码。它在我的情况下有效。我相信我可以帮助您解决问题,如果这没有帮助:

var engine = new Jurassic.ScriptEngine();

var jsRenderPath = "/pathToDir/jsrender.js";
var jsUnevalPath = "/pathToDir/jsRenderUtils.js";
engine.ExecuteFile(jsRenderPath);
engine.ExecuteFile(jsUnevalPath);

engine.Evaluate("function renderTemplate(name, markup) { var tmpl = this.jsviews.templates(name, markup); return uneval(tmpl); }");

var compiledTemplateString = engine.CallGlobalFunction<string>("renderTemplate", templateName, templateString);

var result = "$.templates['" + templateName + "'] = " + compiledTemplateString + ";";

jsRenderUtils.js 内容(非函数)

function uneval(obj, known) {
var root = (known === undefined), result;
known = known || [];

// some values fail eval() if not wrapped in a ( ) parenthesises
var wrapRoot = function (result) {
return root ? ("(" + result + ")") : result;
};

// special objects
if (obj === null)
return "null";
if (obj === undefined)
return "undefined";
if (obj !== obj) // isNaN does type coercion, so can't use that.
return "NaN";
if (obj === Infinity)
return "Infinity";
if (obj === -Infinity)
return "-Infinity";

// atoms
switch (typeof obj) {
case 'function':
return wrapRoot(obj.toString());
case 'number':
case 'boolean':
return obj.toString();
case 'string':
return "\"" + obj.toString() + "\"";
}

// circular reference check for non-atoms
if (known.indexOf(obj) !== -1)
return "null";//throw new Error("Circular references detected while unevaling.");

known.push(obj);

// specialized types
if (obj instanceof Array)
return "[" + obj.map(function (o) { return uneval(o, known); }).join(",") + "]";

if (obj instanceof Date)
return wrapRoot("new Date('" + obj.toString() + "')");

// hashes
var key, pairs = [];
for (key in obj) {
var val;
switch (key) {
case "render":
val = "$.fn.render";
break;
case "markup":
val = "null";
break;
default:
val = uneval(obj[key], known);
}
pairs.push("\r\n" + key + " : " + val);
}

return wrapRoot("{" + pairs.join(",") + "}");

};

更新:如果您将在不使用 jquery 的情况下呈现模板,您应该添加:

$ = window.jsviews;
$.fn = {
render: function (data, view, j, u) {
return this.fn(data, view, j, u);
}
};

关于javascript - 使用 Jurassic 预编译 JsRender 模板服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com