2015-10-26 81 views
3

我想連接一串字符串以在Javascript中構建查詢字符串。以前我已經經歷了醜陋的字符串連接來實現這一點:ES6什麼時候使用String.raw默認模板文字

var queryString = "?action=" + actionValue + "&data=" + dataValue"; 

但隨着ES6我看到有提供了新的方法,可以幫助我達到同樣的效果有多大更好看的代碼,就像在C#6 字符串插值:

string s = $"action={actionValue}&data={dataValue}" 

我有兩個默認模板文字和String.raw,雖然每個命令的語法略有不同,他們都工作進行測試。我傾向於在我的最終副本中使用String.raw,因爲它不允許字符串被標記,因此將來像缺省模板文字一樣被修飾。

雖然它說,在MDN docsString.raw基本上調用默認模板文字的方法,但我喜歡的String.raw更好的語法...我打電話我串的花括號,我格式化,所以也許裏面的String.join方法那是String.raw的誤用。

是否有任何ES6嚮導能夠啓發我,併爲其中一個提供理由?

我的代碼:

var defaultTemplateStringUrl = `@Url.Action("DownloadMultiple")?inIds=${inData.join(',')}&outIds=${outData.join(',')}&truckId=${truckId}`; 
var rawStringUrl = String.raw `@Url.Action("DownloadMultiple")?inIds=${inData.join(',')}&outIds=${outData.join(',')}&truckId=${truckId}`; 

window.open(/*url goes here*/); 
+1

到底是如何使用'String.raw'使用?你是否將它稱爲函數?這似乎很不方便。 –

+1

我對你的問題有點困惑。你不能只是'var queryString = \'?action = $ {actionValue}&data = $ {dataValue} \';'? –

+0

你爲什麼要原始字符串?你所要做的就是使用一個標籤,它在每個插值上調用'encodeURIComponent'。 – Bergi

回答

3

不,使用String.raw對您沒有任何意義。

您應該編寫自己的模板標籤,以便以您喜歡的方式進行必要的URL編碼和處理數組。

function myUrl(parts) { 
    var url = parts[0]; 
    for (var i=1; i<arguments.length; i++) { 
     var val = arguments[i]; 
     if (Array.isArray(val)) 
      val = val.join(","); 
     url += encodeURIComponent(val); 
     url += parts[i]; 
    } 
    return url; 
} 

然後你就可以

window.open(myUrl`@Url.Action("DownloadMultiple")?inIds=${inData}&outIds=${outData}&truckId=${truckId}`); 
+0

感謝您的幫助@Bergi和其他人。 –

+0

'url'雖然是一個數組... –

+0

@FelixKling:'parts'是,'url'是一個字符串 – Bergi

5

模板文字產生一個字符串。如果你使用String.raw,你會得到該字符串的原始形式:

`a\tb`;   // "a b" 
String.raw`a\tb`; // "a\tb" 

所以,你應該用String.raw只有當你想要的原始形式。

+0

Nit:「模板文字」 –

+0

啊我看到了,我應該使用模板文字方法,而不是String.raw來防止URL被正確編碼。 –