Javascript 使用Jurassic在服务器端预编译JsRender模板
我试图从用C#编写的类库中预编译JsRender模板,使用Jurassic脚本引擎执行JsRender 这是我的密码:Javascript 使用Jurassic在服务器端预编译JsRender模板,javascript,templates,jsrender,jurassic,precompiled-templates,Javascript,Templates,Jsrender,Jurassic,Precompiled Templates,我试图从用C#编写的类库中预编译JsRender模板,使用Jurassic脚本引擎执行JsRender 这是我的密码: var engine = new Jurassic.ScriptEngine(); engine.Execute(JsRenderContents); var precompiledTemplate = engine.CallGlobalFunction<string>(String.Concat("$.templates(\"", template, "\
var engine = new Jurassic.ScriptEngine();
engine.Execute(JsRenderContents);
var precompiledTemplate = engine.CallGlobalFunction<string>(String.Concat("$.templates(\"", template, "\");"));
但是,我的代码会产生异常:
'$.templates("<li>{{:Name}}</li>");' is not a function.
这不起作用-可能是因为JsRender的IIF仍然传递这个
,而不是窗口
,我不想修改脚本
有人能帮助推动这一进程吗?我如何从Jurassic调用任何JsRender函数,因为Jurassic。。。我不知道。。。Jurassic实现全局对象的方式可能在概念上有所不同。JsRender可以在没有jQuery的情况下使用 它的工作方式是调用
var compiledTemplate=$.templates(…)
,如果未加载jQuery,则应设置$=window.jsviews
(或在服务器上设置类似项,如this.jsviews)
所以你真的在打电话:
compiledTemplate = this.jsviews.templates(...);
这里有一个例子:(这里的代码)
这里还有很多单元测试:(代码:)
稍后将添加此场景的更多文档/示例。我正在使用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 + ";";
更新:如果要在不使用jquery的情况下呈现模板,则应添加以下内容:
$ = window.jsviews;
$.fn = {
render: function (data, view, j, u) {
return this.fn(data, view, j, u);
}
};
谢谢你的帮助,鲍里斯——从马口中听到这个消息总是很高兴(可以这么说)。不幸的是,错误几乎是一样的。我已将
预编译模板
声明中的字符串.Concat
更改为“this.jsviews.templates(\”,template,“\”;”
,但现在引发的异常是“this.jsviews.templates({Name} ”)不是一个函数。
我认为这更像是一个侏罗纪问题,而不是一个JsRender问题,我会编辑我的问题来反映这一点。我有一个非常简单的模板,由{{:Name}}
组成,并且这个输出(由于格式问题,您必须将其复制粘贴到文本编辑器中,然后自己格式化以进行检查):testJSTemplate:({markup:null,tmpls:[],links:{},tags:{},bnds:[],_is:“template”,render:$.fn.render,tmplName:“testJSTemplate”,htmlTag:“li”,fn:function匿名(data,view,j,u){//testJSTemplate var j=j | jsviews,v,ret=“”;try{ret+=“”,“ret+=(v=data.Name)!=u?v:”;ret+=“ ”return ret;}catch(e){return j._err(e);}}}}}
你觉得这样对吗?我自己无法完全检查,因为我在使用模板时遇到了其他问题,但我不想在对您的答案做出响应之前离开太久。@awj是的,这是正确的。重要通知。您应该使用$.templates['“+templateName+”]
才能使用嵌套模板(包含和用于)我创建了JSFIDLE,发现如果没有jquery,您必须定义$
和$.fn.render
。请查看:非常感谢您的帮助,@Marat。在你回答之前,我已经放弃了这个想法。不客气!)我很高兴我在这方面的研究帮助了除我之外的其他人。
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 + ";";
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(",") + "}");
};
$ = window.jsviews;
$.fn = {
render: function (data, view, j, u) {
return this.fn(data, view, j, u);
}
};