(来自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表明它不是。
答案 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"})