(来自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>
Run Code Online (Sandbox Code Playgroud)
我想使用以下方法应用ViewData变量:
static String applyViewData(String html, Map ViewData) {
// apply interpolation here
}
Run Code Online (Sandbox Code Playgroud)
目前这一切都可能吗?我搜索API表明它不是.
(Bill Hesse发布)
通过将字符串文字包装在以上下文作为参数的函数中,您可以使用Function:context - > String,它可以传递而不是String.如果需要在这些对象上使用一些String操作(如concat),则可以在封装此类型的类上实现这些操作("提升"它们).这似乎是一种直接的方法,可以将字符串文字放在一个位置,并将要插入的数据放在另一个位置.
字符串插值总是动态地发生,每次使用文字时,数据很容易从参数传递到函数而不是从词汇上下文.
例如:
Function MyTemplate() {
return (Context context) {
return "<table><tr><td class=${context.leftColumnClass}>Red Sox</td><td>${context.data}</td></tr></table>";
}
}
Run Code Online (Sandbox Code Playgroud)
...
var templateHere = MyTemplate();
Run Code Online (Sandbox Code Playgroud)
...
var output = templateHere(context);
Run Code Online (Sandbox Code Playgroud)
您还可以跳过间接级别并创建
String FillMyTemplate(Context context) => '''
<html><head><title>$context.title</title></head>
''';
Run Code Online (Sandbox Code Playgroud)
并在需要模板的地方使用FillMyTemplate.
| 归档时间: |
|
| 查看次数: |
2128 次 |
| 最近记录: |