当路由是第一个加载的路由时,如何在父元素上设置类?

时间:2017-04-12 04:02:44

标签: ember.js

我有一个Ember演示应用程序,如果加载的第一条路线是' index',' list'或者' list / index',但如果加载的第一个路线是' list / show'则不行。代码位于https://github.com/DougReeder/beta-list,演示正在https://ember-demo.surge.sh运行要查看问题,请将窗口设置为小于640px,然后浏览到https://ember-demo.surge.sh/list/5您将看到列表面板,而不是细节小组。

根本问题在于,当路线是' list / show'时,div与类' panelList'和' panelDetail'也应该有正确的等级'

我无法在模板中设置此项,因为panelList和panelDetail是由父列表'创建的。模板。如果我将panelList和panelDetail移动到子模板&list; list / index'和' list / show'然后从' list / index'开始重新呈现列表。列出/显示'这将是一场糟糕的表演。

目前,我使用' didTransition'切换课程的动作“正确”#39;这被称为然后从' list / index'到'列出/显示',以及何时列出/显示'是最初的路线。不幸的是,如果' list / show'是第一条路线,当'转换'时,没有任何DOM元素存在。被称为。

我可以设想解决方案的两条路线,但不知道如何实施:

  1. 切换课程'对'在DOM元素存在之后发生的某些动作。

  2. 在'列表中插入条件代码'模板,设置课程'权利' on' panelList'和' panelDetail'如果实际路线是' list / show'。

  3. 建议?

3 个答案:

答案 0 :(得分:1)

回答Ember v2.12.0中的电流

您可以使用link-to helper呈现链接以外的元素,其样式会根据路线而变化。利用activeClasscurrent-whentagName属性,您基本上可以根据您所在的路线设置该元素的样式。例如,要渲染panelList div:

{{#link-to tagName='div' classNames='panelList' activeClass='right' current-when='list/show'}}
  More markup
{{/link-to}}

答案 1 :(得分:0)

我喜欢空组件的技巧。在initdidInsertElement挂钩中,您可以从父元素或(我更喜欢它)主体添加和删除css类。这是一个代码:

willDestroyElement

我在模板中使用它(在我的示例中它是import Ember from 'ember'; export default Ember.Component.extend({ bodyClass: '', didInsertElement() { const bodyClass = this.get('bodyClass'); if (bodyClass) { Ember.$('body').addClass(bodyClass); } }, willDestroyElement() { const bodyClass = this.get('bodyClass'); if (bodyClass) { Ember.$('body').removeClass(bodyClass); } } }); 路线的模板),就像这样

player

要将类应用于父元素,可以使用{{body-class bodyClass='player-page-active'}} ,但使用body更可靠。请注意,此组件将创建一个空div,但它不应该是一个问题(在极少数情况下,如果需要,可以使用this.$().parent()和css进行修复)。

答案 2 :(得分:0)

Sukima建议查看currentRouteName,然后我找到hschillig's solution,我根据我的情况进行了简化。在控制器中,我创建了一个isShow函数:

export default Ember.Controller.extend({
  routing: Ember.inject.service('-routing'),

  isShow: function() {
    var currentRouteName = this.get('routing').get('currentRouteName');
    return currentRouteName === 'list.show';
  }.property('routing.currentRouteName'),

在模板中,我现在使用if帮助程序:

  <div class="panelList {{if isShow 'right'}}">

RustyToms的答案消除了向Controller添加功能的需要,但代价是语义较少。