0

如果我把一個模板從JavaScript和:發送編譯對象Closure模板

namespace.template(record); 

其中record是一個實例:

/** @typedef {{var: string}} */ 

我用的是谷歌關閉編譯器在高級模式下,其中重寫var,那麼我怎樣才能在模板中接收var?是使用'var'而不是var來防止重寫唯一的方法來做到這一點?我想,如果我可以爲模板的@param提供類型,就像我可以爲JavaScript代碼一樣,它應該讓編譯器知道要使用的重寫名稱...


看起來這不會發生任何值var。它確實發生,雖然如果密鑰名爲default,因爲SoyToJsSrcCompiler使用'default'(僅針對這個特殊名稱,而不是針對我迄今爲止使用的任何其他名稱)生成代碼,因此阻止Closure編譯器重命名它,但該屬性在JavaScript代碼,因爲我使用的是default而沒有引號。

回答

1

如果你的模板看起來是這樣的:

/** 
* Foo 
* @param rec 
*/ 
{template .Foo} 
    <div>{$rec.var}</div> 
{/template} 

然後SoyToJsSrcCompiler會產生類似代碼:

/** 
* @param {Object.<string, *>=} opt_data 
* @param {(null|undefined)=} opt_ignored 
* @return {string} 
* @notypecheck 
*/ 
namespace.Foo = function(opt_data, opt_ignored) { 
    return '<div>' + soy.$$escapeHtml(opt_data.rec.var) + '</div>'; 
}; 

這個生成的模板函數是指包含在與源文件編譯。由於輸出屬性訪問格式爲rec.var,因此編譯器應該正確地對其進行重命名。

+0

確實,這似乎工作(正如我所預期的那樣)。但現在我明白了問題的真正原因。如果一個屬性被命名爲'default',那麼由SoyToJsSrcCompiler生成的代碼將其寫爲'['default']',但該屬性被Closure Compiler在原始對象中重命名......可能發生這種情況是因爲'default'是一個保留字,我猜大豆編譯器害怕破壞語法,如果它沒有引用它(即使'rec.default'是完全有效的語法)......我可以用一種方式解決這個問題不涉及重命名我的財產? – rid

+0

只有在原始模板中使用類似'{$ rec ['var']}''的語法時纔會出現您所描述的內容。在這種情況下,您需要像'namespace.foo({rec:{'var':val}})''一樣調用您的模板以避免您當前看到的混合屬性訪問問題。 –

+0

該模板包含類似於'{$ rec.foo.default.bar}'的東西,它生成代碼'opt_data.rec.foo ['default']。bar'。它似乎只使用名稱「default」的引號,但不用於其他任何內容。 – rid