我可以申请飞镖的串插动态?(Can I apply Dart's string interp

2019-06-26 21:46发布

(由特里斯坦·麦克纳布达特讨论邮件列表)

我试图建立一个服务器端的MVC框架和基于模板和诸如此类的东西产生的看法,我想知道如果我可以动态地应用飞镖的串插。 例如,这将是我的视图模板:

<!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的搜索表明,事实并非如此。

Answer 1:

(由比尔·黑塞发布)

通过包装字符串函数文本,是以情境作为参数,你可以有一个功能:背景 - >字符串可以传递的,而不是一个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。



Answer 2:

(由山姆·麦考尔发布)

有涉及招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"})


文章来源: Can I apply Dart's string interpolation dynamically?
标签: dart