Ember link-to获取错误转换的活动类

时间:2015-10-09 04:15:06

标签: ember.js ember-cli

这是Ember问题之一,我无法复制anywhere,但我的项目。该问题的视觉效果是active上的link-to类是落后的一个过渡。我将点击一个链接,并使用active类突出显示我刚刚访问的页面的链接。

我已经开始深入研究link-to组件code,以确定如何计算active。但它基于_routing.currentState,我不确定那是什么。 currentState和其他信息将传递给routing的{​​{3}},然后调用routerState的{​​{3}}。 isActiveForRoute调用另一个isActiveIntent并将更多内容进行比较。所有这些看起来像一个大型的复活节彩蛋寻找某些东西(我的问题的根源),这可能不是在Ember的代码中。

我觉得以下片段总结了我遇到的问题。 targetRouteName是链接指向的路由。 _routing.currentRouteName似乎指向浏览器当前正在查看的路由。这些匹配的事实让我觉得链接应该是active,但active函数会返回false

> link.get('targetRouteName')
"parentRoute.pageA.index”
> link.get('_routing.currentRouteName')
"parentRoute.pageA.index”
> link.get('active')
false
  

作为参考,这是在通过Chrome扩展程序找到链接并显示所有组件之后。然后我做了link = $E

对于错误的链接(获得active类的链接),我得到:

> link.get('targetRouteName')
"parentRoute.pageB.index"
> link.get('_routing.currentRouteName')
"parentRoute.pageA.index"
> link.get('active')
"active"

其他原始信息

我正在处理的路线是嵌套的。但这是一个非常标准的嵌套,非常类似于我isActiveIntent中的嵌套(例如page-apage-bpage-c)。

父路线和子路线的索引上有一个模型钩子。但是孩子们将父母的路线引用(this.modelFor(...))。

我的模板引用了这些路线的.index。它们是标准的link-to组件。它们不包括模型信息。

我正在运行Ember-cli 1.13.8,Ember 2.0.0和Ember Data 2.0.0-beta.1。

到目前为止我尝试了什么

  • 升级至1.13.0
  • 将文件结构移动到pods
  • 删除许多这些路由继承的身份验证路由中的函数。
  • 升级到2.0.0
  • 尝试在我的路线上删除/添加.index
  • 尝试在function
  • 上复制
  • 使用ember-cli执行ember init以查看我的路由器或应用程序设置是否与标准布局不同,并且它没有任何重大差异。
  • 将模型信息添加到其中一个链接,这些链接没有任何改变,因为它没有调用模型挂钩,所以它搞砸了视图。
  • 问松弛频道

请帮助

我已经有这个问题已经有几个星期了,而且我不知道还能在哪里看。我很想知道如何解决这个问题。

更新

最终在2.1.0中得到修复。

2 个答案:

答案 0 :(得分:1)

当您使用willTransition路由器操作时,这是常见问题。例如,

IMS.ResultDetailsEditRoute = Ember.Route.extend({
    actions: {
        willTransition: function() {
            this.controller.clearForm();
        }
    }    
});

在这段代码中,剪切了willTransition,称为控制器" clearForm()"不再存在。出于某种原因,Ember不会抛出错误,但它会导致@RyanJM解释的问题。

答案 1 :(得分:0)

使用带导航的组件时遇到了类似的问题。这是我的方法:

我添加了一个控制器(我知道,你应该转向这些,但我需要)。我的控制器:

import Ember from 'ember';

const {
  Controller,
  inject
} = Ember;

export default Controller.extend({
  application: inject.controller(),
});

然后,在我的模板中,我可以将应用程序传递给我的组件。

{{account/account-icon-nav currentRouteName=application.currentRouteName}}

在我的组件中,我设置了一个函数来测试我当前的路由名称:

import Ember from 'ember';

const {
  Component,
  computed,
  get
} = Ember;

const activeParentRoute = function(dependentKey, parentRouteName) {
  return computed(dependentKey, {
    get() {
      return get(this, dependentKey).indexOf(parentRouteName) > -1;
    }
  });
};

export default Component.extend({
  isYourProfile: activeParentRoute('currentRouteName', 'account.your-profile'),
  isYourActivity: activeParentRoute('currentRouteName', 'account.your-activity'),
  isYourGoals: activeParentRoute('currentRouteName', 'account.your-goals')
});

然后自己绑定活动类:

<div class="icon-nav md-hidden">
  {{link-to "" "account.your-profile" classBinding=":profile isYourProfile:active" title="Your Life"}}
  {{link-to "" "account.your-activity" classBinding=":activity isYourActivity:active" title="Your Money"}}
  {{link-to "" "account.your-goals" classBinding=":goals isYourGoals:active" title="Your Goals"}}
</div>

我知道这有点不同,因为我们在一个组件中这样做,但我希望它有所帮助。您可以通过传递应用程序来自己绑定这些类。