语言切换后,我需要重新渲染整个页面应用程序。由于性能问题,我不喜欢使用观察者。
语言切换由Ember.View
. 我尝试parentView
在更改后重新渲染,Ember.I18n.translations
但遇到了一个已知的错误。它可以工作一次,但 Ember Inspector 显示 parentView 之后有自己的子视图。在另一个开关 parentView 被破坏后。就像在这个 JSFiddle中演示的那样。
这是我的观点的简化代码:
export default Ember.View.extend({
templateName: 'language-switch',
languageChanged: function() {
// change language
var language = this.get('controller.language.selected');
Ember.I18n.translations = translations[language];
// rerender page
this.get('parentView').rerender();
}.observes('controller.language.selected')
});
在讨论.emberjs.com 上也有关于该问题的讨论。我尝试了那里的建议,但它们不起作用。上一篇文章建议对所有视图进行映射,重新渲染它们,然后使用过渡。我不喜欢那个,因为我害怕那个 hack 会带来一些附带问题。
我很确定必须有一种方法可以在 Ember 中使用 ember-i18n 进行语言切换,但正确的方法是什么?
更新:
我试图从讨论.emberjs.com 实施黑客攻击。它有效,但非常有限。我在视图中这样实现它:
var self = this;
var currentRoute = self.get('controller.currentRouteName');
this.get('controller.target').transitionTo('loading').then(function(){
self.get('controller.target').transitionTo(currentRoute);
});
问题是模型中存储的所有数据都丢失了。我没有找到获取当前模型并在过渡中使用它的方法。查询参数也会丢失。这种限制使我的应用程序无法接受这种全面工作。
更新 App.reset():
正如评论中所建议的,我尝试使用App.reset()
. 它比 transitionTo work-a-round 效果更好,但不能满足所有需求。如果调用 App.reset() queryParams 没有丢失但模型被重置。我正在寻找一种在保留当前模型和查询参数的同时重新呈现应用程序的方法。
似乎大多数这些问题是通过在语言环境更改时重新加载整页来处理的。Eq ember-i18n 的主要开发者之一在本次讨论中这样说。