11

(Tristan McNabによるDartディスカッションメーリングリストから)

サーバー側のMVCフレームワークを構築し、テンプレートなどに基づいてビューを生成しようとしていますが、Dartの文字列補間を動的に適用できるかどうか疑問に思いました。たとえば、これは私のビューテンプレートになります。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>${ViewData["Title"]}</title>
    <link href="/Content/css/site.css" rel="stylesheet" />
  </head>
  <body>
    <h1>${ViewData["Title"]}</h1>
    <div id="container">
      <p>Hello world!</p>
    </div>
  </body>
</html>

そして、次を使用してViewData変数を適用したいと思います。

static String applyViewData(String html, Map ViewData) {
    // apply interpolation here
}

現時点でこれは可能ですか?APIを検索したところ、そうではないことがわかりました。

4

2 に答える 2

8

(Bill Hesseによる投稿)

コンテキストをパラメータとして受け取る関数で文字列リテラルをラップすることにより、Stringの代わりに渡すことができるFunction:context->Stringを持つことができます。これらのオブジェクトでconcatなどの文字列操作を使用する必要がある場合は、このタイプをカプセル化するクラスにこれらの操作を実装できます(オブジェクトを「持ち上げる」)。これは、ある場所で文字列リテラルを与え、別の場所で補間したいデータを与える簡単な方法のように思えます。

文字列補間は、リテラルが使用されるたびに常に動的に発生し、データは、字句コンテキストからではなく、パラメーターから関数に簡単に取得できます。

例えば:

Function MyTemplate() {
   return (Context context) {
     return "<table><tr><td class=${context.leftColumnClass}>Red Sox</td><td>${context.data}</td></tr></table>";
   }
}

..。

var templateHere = MyTemplate();

..。

var output = templateHere(context);

レベルの間接参照をスキップして、作成することもできます

String FillMyTemplate(Context context) => '''
    <html><head><title>$context.title</title></head>
''';

テンプレートが必要な場所でFillMyTemplateを使用します。

于 2012-08-09T15:32:30.300 に答える
4

(Sam McCallによる投稿)

関係するトリックがありnoSuchMethod()ます:

class Template {
  var _context;

  noSuchMethod(method, args) {
    if (!method.startsWith("get:")) return super.noSuchMethod(method, args);
    return _context[method.substring(4)];
  }

  abstract String template();

  String evaluate(context) {
    _context = context;
    try {
      return template();
    } finally { _context = null; }
  }
}

次に、サブクラスを作成します。

class MyTemplate extends Template { template() => """
  <title>$title</title>
  <h1>$title</h1>
""";}

最後に、それを使用してください!

final renderedText = new MyTemplate().evaluate({"title": "Hello, world"})
于 2012-08-09T15:30:40.393 に答える