这个问题的简短版本:我正在尝试在发生特定事件(语言更改)时重新呈现我的 ApplicationView。ApplicationView 仅包含一个简单的插座,但是在重新渲染时,此插座仍然是空的。那么,重新渲染整个页面的正确方法是什么?
简化的应用程序代码(http://jsfiddle.net/6ZQh7/2/):
Ember.Handlebars.registerHelper('t', function() {
return App.get('language') == 'en' ? 'Hi there!' : 'Hallo!';
});
App = Ember.Application.create({
language: 'en',
ApplicationView: Em.View.extend({
templateName: 'application'
}),
TestView: Em.View.extend({
templateName: 'test'
}),
ApplicationController: Em.Controller.extend(),
Router: Em.Router.extend({
root: Em.Route.extend({
toggleLanguage: function(router) {
App.set('language', App.get('language') == 'en' ? 'nl' : 'en');
// view.parentView resolves to the ApplicationView
router.get('applicationController.view.parentView').rerender();
},
index: Em.Route.extend({
route: '/',
connectOutlets: function(router) {
router.get('applicationController').connectOutlet('test')
}
})
})
})
});
对应的HTML:
<script type="text/x-handlebars" data-template-name="application">
<h1>{{t whatever}}</h1>
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="test">
<h2>My Test Page</h2>
<a href="#" {{action toggleLanguage}}>Toggle language.</a>
</script>
做一些调试(嗯,一些;几个小时),似乎当重新渲染发生时,渲染插座的 ContainerView 没有上下文,这意味着没有 currentView(绑定到这个上下文) ,这意味着插座中根本没有渲染任何内容。从头开始,有一个工作环境;如果我this.get('templateData.keywords.view.context')
使用调试器调用 ContainerView#init,我会得到应用程序控制器。有趣的是,this.get('templateData.keywords.view.context.view')
(应该返回出口的视图)返回未定义,而 `this.get('templateData.keywords.view.context').get('view')确实返回视图。
上下文:我正在尝试编写一个国际化的 Ember.js 应用程序,其中包含一个简单的翻译助手,以当前设置的语言输出字符串(与 Ember-I18n 结合使用)。目前更改语言需要重新加载页面,因为这些语言字符串是未绑定的(我会说得对,因为语言更改很少见,并且为页面上的每个字符串创建绑定听起来是个坏主意)。但是,我只想重新渲染而不是重新加载。