0

こんにちは、私はノードが初めてで、doT.js ( http://olado.github.io/doT/index.html ) を使用してファイルから文字列にパーシャルをコンパイルする方法を理解しようとしています。

/controllers/system/index.js:

var util = require( 'util' ),
    fs = require( 'fs' ),
    dot = require( 'dot' );

function System( ) {
    this.name = 'system';
}

System.prototype._loadFile = function( path, def ) {
    var def = def || { },
        tpl, str;

    str = fs.readFileSync( process.argv[ 1 ].replace( /\/[^\/]*$/, path ) );
    tpl = dot.compile( str );
    str = tpl( def );

    return str;
};

System.prototype._getHeaderContent = function( ) {
    return this._loadFile( '/controllers/system/views/header.html', {
        name: this.name
    });
};

System.prototype._getBodyContent = function( ) {
    return this._loadFile( '/controllers/system/views/main.html' );
};

System.prototype._getFooterContent = function( ) {
    return this._loadFile( '/controllers/system/views/footer.html' );
};

System.prototype.index = function( req, res, next ) {
    res.render( __dirname + '/../system/views/template', {
        header: this._getHeaderContent( ),
        body: this._getBodyContent( ),
        footer: this._getFooterContent( )
    });

    next ? next( ) : '';
};

module.exports = System;

/controllers/system/views/template.html:

{{=it.header}}
{{=it.body}}
{{=it.footer}}

/controllers/system/views/header.html:

<!doctype html>
<html lang="en">
<head>
    <title>app | {{=it.name}}</title>
</head>
<body>

System.index で res.render template.html を呼び出すとコンパイルされますが、header.html はコンパイルされません。そのことから、render はファイルを再帰的にレンダリングしないと想定しており、res.render に渡す前に、header.html を手動でコンパイルする必要があります。

このチュートリアルを見つけました: http://olado.github.io/doT/tutorial.html#compile but .template と .compile の両方が関数を返しますか? それらを res.render に渡そうとすると、エラーがスローされます。

それらを文字列にコンパイルするにはどうすればよいですか? それとも、これについて間違った方法で行っていますか?

ありがとう!

アップデート - Andreas Hultgren に感謝します。

4

1 に答える 1

1

dot.compile()またはdot.template()、テンプレート文字列からコンパイルされた関数を返します。compiledTemplate(data)生成されたテンプレートを文字列として取得するには、データ ( ) の有無にかかわらず呼び出します。ちなみに、ほとんどのテンプレート エンジンはこのように動作します。

于 2013-09-14T16:57:36.477 に答える