3

JsRender を実行するためにジュラシック スクリプト エンジンを使用して、C# で記述されたクラス ライブラリから JsRender テンプレートをプリコンパイルしようとしています。

これが私のコードです:

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

このページ$.templates()からJavaScript 関数呼び出し を取得しました。

$.templates(markupOrSelector) の戻り値: コンパイルされたテンプレート オブジェクト

そして、私のサンプル HTML テンプレートは単純です

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

ただし、私のコードでは例外が発生します。

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

ここで、jQuery が存在しなくても $ 演算子を使用できるかどうかは 100% 明確ではありません。著者は、いくつかの例に jQuery を含めていますが、jQuery は必須ではないとも述べています。

それで、何がうまくいかないのですか?この質問を投稿した同じ日に GitHub から取得した JsRender のバージョンのドキュメントは古くなっていますか? (JsRender がまだベータ版であることは承知しています。) それとも、ジュラシックを誤用しているのでしょうか?

編集:

これは実際には JsRender の質問というよりジュラ紀の質問だと思います。具体的には、これは Jurassic のグローバル オブジェクトに関連していると思います。JsRender は を渡す即時呼び出し関数にラップされておりthis、Jurassic が提供するかどうかはわかりませんthis

この質問に直面したのは私が初めてではないようです。このページの最後の投稿からアドバイスを受けて、コードを次のように変更しました。

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れ、スクリプトを変更したくないためです。

誰でもこれを前進させるのを助けることができますか? ジュラシックを考えると、ジュラシックからJsRender関数を呼び出すにはどうすればよいですか...わかりません...おそらく、ジュラシックがグローバルオブジェクトを実装する方法にいくつかの概念的な違いがあります。

4

2 に答える 2

1

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);
    }
};
于 2014-06-16T21:27:35.247 に答える
0

JsRender は jQuery なしで使用できます。

のような呼び出しvar compiledTemplate = $.templates(...);で、jQuery がロードされていない場合は$ = window.jsviews、(サーバー上では this.jsviews などの同等の) を設定する必要があります。

だから本当にあなたは呼んでいます:

compiledTemplate = this.jsviews.templates(...);

ここに例があります: http://borismoore.github.io/jsrender/demos/step-by-step/20_without-jquery.html (コードはこちらhttps://github.com/BorisMoore/jsrender/blob/master/ demos/step-by-step/20_without-jquery.html )。

ここにも多くの単体テストがあります: http://borismoore.github.io/jsrender/test/unit-tests-jsrender-no-jquery.html (コード: https://github.com/BorisMoore/jsrender/ blob/master/test/unit-tests-jsrender-no-jquery.html )。

このシナリオのドキュメント/サンプルは、後でhttp://www.jsviews.comに追加されます。

于 2014-05-30T17:54:27.690 に答える