【发布时间】:2014-05-29 19:13:05
【问题描述】:
我正在尝试从用 C# 编写的类库中预编译 JsRender 模板,使用侏罗纪脚本引擎来执行 JsRender。
这是我的代码:
var engine = new Jurassic.ScriptEngine();
engine.Execute(JsRenderContents);
var precompiledTemplate = engine.CallGlobalFunction<string>(String.Concat("$.templates(\"", template, "\");"));
我从 this page 获取了 JavaScript 函数调用 $.templates(),它声明
$.templates(markupOrSelector) 返回:已编译的模板对象
我的示例 HTML 模板很简单
<li>{{:Name}}</li>
但是,我的代码产生了异常:
'$.templates("<li>{{:Name}}</li>");' is not a function.
现在,我不是 100% 清楚是否可以在没有 jQuery 的情况下使用 $ 运算符。作者在他的几个示例中包含了 jQuery,但也声明 jQuery 不是必需的。
所以出了什么问题?在我发布此问题的同一天,从 GitHub 获取的 JsRender 版本的文档是否已过期? (我知道 JsRender 仍处于测试阶段。)或者我在滥用侏罗纪?
编辑:
我相信这实际上是一个侏罗纪问题而不是 JsRender 问题。具体来说,我认为这与侏罗纪的全局对象有关,因为 JsRender 被包装在一个通过 this 的立即调用函数中,我不确定侏罗纪是否提供了 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,我不想修改脚本。
任何人都可以帮助推动这一进程吗?鉴于侏罗纪……我不知道……也许侏罗纪实现全局对象的方式存在一些概念上的差异。
【问题讨论】:
标签: javascript templates jsrender jurassic precompiled-templates