1

transition在路由 js 文件中获取数据,如下所示:

beforeModel(transition) { console.log(transition)  }

我想在我的控制器中的一个函数中使用它,如下所示:

import Controller from '@ember/controller';

export default class ListingsController extends Controller {

    get pageTitle() {
        if (this.transition.targetName == 'foo') {
        return 'page title';

        }
      }

}

然后我想显示这样的结果:

<h1>{{this.pageTitle}}</h1>

我找不到将transition数据从路由传递到控制器的方法。有任何想法吗?

4

2 回答 2

3

虽然您在技术上可以利用@KathirMagaesh 建议beforeModel的那样通过获取控制器this.controllerFor,但我实际上并不提倡这种解决方案。这绝对不是正常预期的Ember 模式。此外,如果您查看转换 api,则没有引用transition.targetName. 如果可行,则这是私有 api,因此很脆弱。

如果您需要根据当前路由更改属性,您应该使用公共路由器服务,它为此目的提供了一些有用的属性!

例如,在您的控制器中,您可以有一个计算属性,该属性利用路由器服务来确定页面标题应该是什么

import Controller from '@ember/controller';
import { computed } from '@ember/object';
import { inject } from '@ember/service';

// this injects the router service into our component via Ember's DI framework
router: inject(),
export default Controller.extend({
  pageTitle: computed('router.currentRouteName', function(){
     let currentRoute = this.router.currentRouteName;
     if(currentRoute === 'foo'){
        return 'page title';
     } 
     // do other stuff for other routes. 
  })
})

这利用了currentRouteName,它是句点分隔的名称,如foo.bar. 您还可以通过currentURL访问 url,这将是/foo/bar

PS。由于我还没有使用过 ES6 类,所以我提供了老式的 ember 解决方案。您可能需要使用@computed装饰器或@tracked我正在使用该computed功能的地方。我只知道 RFC 和很棒的博客文章中的 Octane ember 样式,但我不了解最新的内容。

聚苯乙烯。如果您使用的是旧 ember,则当前路由名称/URL 属性在应用程序控制器上可用。

于 2019-06-04T12:50:17.770 回答
2

beforeModel钩子中使用

this.controllerFor(currentrRouteName).set('transition', transition);

这将在当前路由器的控制器中设置转换属性。

有关controllerFor()的更多信息

于 2019-06-04T11:28:40.680 回答