此問題的簡短版本:當特定事件發生(語言更改)時,我試圖重新呈現我的ApplicationView。 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(它綁定到這個上下文),這意味着什麼都沒有呈現在出口處所有。劃痕,有一個工作環境;如果我使用調試器在ContainerView#init中調用this.get('templateData.keywords.view.context')
,那麼我得到applicationcontroller。有趣的是,this.get('templateData.keywords.view.context.view')
(它應該返回出口的視圖)返回undefined,而`this.get('templateData.keywords.view.context')。get('view')確實返回視圖。
上下文:我試圖編寫一個國際化的Ember.js應用程序,它包含一個簡單的翻譯助手,以當前設置的語言(與Ember-I18n一起使用)輸出字符串。目前改變語言需要重新加載頁面,因爲這些語言字符串是未綁定的(我會這樣說,因爲語言更改很少,並且創建頁面上每個字符串的綁定聽起來像一個壞主意)。不過,我想重新渲染而不是重新加載。
{{loc appName}}
更改語言:
我不認爲你需要重申應用程序視圖,如果你只需要應用語言改變...使用綁定直接影響語言w/o重新渲染的應用程序查看 –
是的,但正如我最後段落我不得不爲頁面中的每個字符串創建綁定,即使它們可能永遠不會改變,這似乎是矯枉過正(和潛在的性能瓶頸)。 另外目前我很kindaa只是好奇如何做到這一點:)。 –
不,不是這樣,檢查答案和自己嘗試 –