我已经用Ember做了几个小时的实验,但没有成功。希望这只是我在阅读Ember文档时遇到的一个术语问题。
我有一个应用程序,它在很大程度上由一个侧边栏/顶部栏(称为包装器)和一个页脚组成。
我的基本应用程序.hbs看起来是这样的(我正在使用Ember App Kit来提供结构):
{{partial "wrapper"}}
{{outlet}}
{{partial "footer"}}
如果这是我的应用程序的状态,它会运行得很好。页面内容加载在{{outlet}}罚款中。
我的主要问题是如何以"Ember"的方式打破这个模板结构(最好不要使用所有jQuery和随意删除DOM元素)。
我有一些路由不希望包装器和页脚显示在上面(它们是全页登录/忘记密码路由,以及一些最小界面/无干扰模式)。
我尝试通过制作默认模板(application.hbs)来删除侧边栏和页脚:
{{#if showWrappers}}
{{partial "wrapper"}}
{{/if}}
{{outlet}}
{{#if showWrappers}}
{{partial "footer"}}
{{/if}}
其中showWrappers
在ApplicationController中:
export default Ember.Controller.extend({
showWrappers: function() {
var routes = ['login'],
currentPath = this.get('currentPath'),
show = true;
routes.forEach(function(item) {
var path = new RegExp('^' + item + '*');
if (!Ember.isEmpty(currentPath.match(path))) {
show = false;
}
});
return show;
}.property('currentPath'),
});
尝试从/使用{{link to}}转换到/登录返回一个错误:Uncaught Error: Cannot perform operations on a Metamorph that is not in the DOM
可能是因为我正在删除Ember想要保留的东西(我在侧边栏中使用{{link to}}和{{bind-attr}},所以那里有绑定)。
意识到我可以使用actions和jQuery来隐藏页面的元素,并将它们带回"无干扰"模式,但我更愿意学习如何构建模板,并使用带有renderTemplate钩子的Routes,可能会使用this.render(?)来破坏当前DOM,并从不同的基础(而不是application.hbs)重建。
想法?非常乐意澄清。
我发现了disconnectOutlet,并将我的部分转换为outlet:
{{outlet wrapper}}
{{outlet}}
{{outlet footer}}
使我的ApplicationRoute默认呈现给他们:
export default Ember.Route.extend({
renderTemplate: function() {
this.render();
this.render('wrapper', {
outlet: 'wrapper',
into: 'application'
});
this.render('footer', {
outlet: 'footer',
into: 'application'
});
}
});
然后在LoginRoute上,我只为包装器和页脚运行this.disconnectOutlet,并且似乎运行得很好。