我可以动态应用Dart的字符串插值吗?

时间:2012-08-09 15:30:40

标签: dart

(来自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表明它不是。

2 个答案:

答案 0 :(得分:6)

(Bill Hesse发布)

将字符串文字包装在一个以上下文为中的函数中 一个参数,你可以有一个Function:context - &gt;你可以的字符串 传递而不是String。如果你需要使用一些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。

答案 1 :(得分:3)

(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"})