この質問の短いバージョン: 特定のイベント (言語の変更) が発生したときに 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')
(アウトレットのビューを返す必要があります) は undefined を返しますが、`this.get('templateData.keywords.view.context').get('view')はビューを返します。
コンテキスト: 国際化された Ember.js アプリを作成しようとしています。これには、現在設定されている言語 (Ember-I18n と組み合わせて使用) で文字列を出力する単純な翻訳ヘルパーが含まれています。現在、言語を変更するには、これらの言語文字列がバインドされていないため、ページのリロードが必要です (言語の変更はまれであり、ページ上のすべての文字列にバインドを作成するのは悪い考えのように聞こえるため、当然のことながらそう言えます)。ただし、リロードする代わりに再レンダリングしたいだけです。