2012-08-09 81 views
4

(由特里斯坦·麥克納布達特討論郵件列表)我可以動態應用Dart的字符串插值嗎?

我試圖建立一個基於模板和諸如此類的服務器端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的搜索表明它不是。

回答

4

(由比爾·黑塞發佈)

通過包裝的字符串函數文本,是以上下文 參數,你可以有一個功能:背景 - >字符串,你可以 繞過而不是一個字符串。如果您需要在這些對象上使用某些字符串操作(如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。

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"}) 
相關問題