Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Jurassic在服务器端预编译JsRender模板_Javascript_Templates_Jsrender_Jurassic_Precompiled Templates - Fatal编程技术网

Javascript 使用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, "\

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

这是我的密码:

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);
        }
    };