您不能輕易更改應用程序模板。 Ember不會聽templateName
屬性更改,並且在您嘗試自己重新渲染模板時反應不佳。
這樣做的一個好方法是根據您是處於「屏幕」還是「打印」模式,在應用程序模板中使用不同的部分。
<script type="text/x-handlebars">
{{#if isPrint}}
{{partial "application-print"}}
{{else}}
{{partial "application-normal"}}
{{/if}}
</script>
<script type="text/x-handlebars" data-template-name="application-normal">
<div id="app-normal">
<h2>Normal template</h2>
{{outlet}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="application-print">
<div id="app-print">
<h2>Print template</h2>
{{outlet}}
</div>
</script>
App.ApplicationController = Ember.Controller.extend({
isPrint: false,
currentPathChange: function() {
var currentPath = this.get("currentPath");
var isPrint = currentPath ? currentPath.indexOf("print") === 0 : false;
this.set("isPrint", isPrint);
}.observes('currentPath').on("init")
});
This JSBin將展示爲什麼這很不幸,也不管用。根據this bug report,當同一頁面有多個outlet
指令時,即使它們在不同的#if
範圍內,Ember的把手也會變得混亂。
在此問題得到解決之前,我提出以下稍作修改的解決方案。
應用程序模板爲空。正常和打印部分各有一個模板。
<script type="text/x-handlebars">
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="normal">
<div id="app-normal">
<h2>Normal template</h2>
{{outlet}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="print">
<div id="app-print">
<h2>Print template</h2>
{{outlet}}
</div>
</script>
在路由器中,一切都進入正常和打印資源。普通資源放置在/處,以便所有鏈接保持不變。在ApplicationController中無需特殊編碼。
App.Router.map(function() {
this.resource("print", function() {
this.route("a");
this.route("b");
});
this.resource("normal", {path: "/"}, function() {
this.route("a");
this.route("b");
});
});
Working jsbin here。
感謝您的答覆@ panta82 ...這意味着我必須將我的路線更改爲print.route1和normal.route2吧? – Melvin
你已經擁有'print'資源。您只需要將其他路線更改爲「screen」或「normal」資源(或任何您想要調用它的內容)。在你上面的例子中,這將是「儀表板」和「任何」路線。 – panta82
謝謝人..乾杯! – Melvin