配置模板加载器以传递额外参数

问题描述:

我正在处理我的Aurelia组件的i18n。我想渲染翻译服务器端,因为我们的翻译存储在CMS中,并且可以在部署后进行更新。我已经成功地编写了一个Java WebFilter,它可以拦截对Aurelia模板的请求并在返回模板之前转换字符串。配置模板加载器以传递额外参数

所有这些都很有效,直到用户切换语言。这是作为整页刷新实现的,首选语言存储在服务器端会话中。所以模板解析器确实会选择语言改变。问题在于Aurelia模板已经被缓存在客户端,并且在其中有错误的翻译。

现在我已经采取的一种解决方法是禁用模板的缓存。但理想情况下,我希望浏览器缓存模板,直到语言发生变化时再次请求模板。

一个简单的解决方案是将语言添加到模板请求的URL。这样一旦语言发生变化,缓存的模板就不会被使用。 (如果用户决定改回语言,我们可以再次从缓存中加载它们!)

我试过实现这个,但是我在(默认)加载器上找不到任何文档。我可以配置它将语言作为参数添加到模板URL吗?或者我可以创建一个自定义加载器来添加此行为?

尝试添加以下内容到main.js猴修补模板加载器的语言查询字符串逻辑:

import {TextTemplateLoader} from 'aurelia-loader-default'; 

// capture the standard logic in a new "standardLoadTemplate" method. 
TextTemplateLoader.prototype.standardLoadTemplate = TextTemplateLoader.prototype.loadTemplate; 
// intercept calls to "loadTemplate" and add the query string before calling the standard method. 
TextTemplateLoader.prototype.loadTemplate = function(loader, entry) { 
    entry.address += '?' + 'en-US'; // todo: set based on currently selected language 
    return this.standardLoadTemplate(loader, entry); 
}; 

export function configure(aurelia) { 
    ... 

下面是一个例子:https://gist.run/?id=de8ec2de79511bf9e873

+0

好极了!非常感谢你。 –

+0

未来人们发现这种情况的注意事项:对JS文件做相同的处理相对容易。只需为SystemJS编写一个插件,例如'exports.locate = function(load){return load.address +'?lang ='+ curLang; };'并将其注册到你的config.js中:'meta:{“myapp/*”:{loader:“lang-loader”}} –