(由特里斯坦·麦克纳布达特讨论邮件列表)
我试图建立一个服务器端的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的搜索表明,事实并非如此。
(由比尔·黑塞发布)
通过包装字符串函数文本,是以情境作为参数,你可以有一个功能:背景 - >字符串可以传递的,而不是一个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。
(由山姆·麦考尔发布)
有涉及招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"})