22

设置页面标题的最佳方法是什么,以便在 url 之间转换时,标题将反映新状态?有没有办法设置路由器来做到这一点?

我想要一种允许我为每个状态设置页面标题架构的方法。因此,如果路由有参数,它们将被传递到 pageTitle:

sessions : Ember.Route.extend({
       route:"/sessions",
       connectOutlets : function(router) {
           //...
       },
       pageTitle:function(){
            return "Sessions";
       },
   })

对于如何最好地在模型或其他地方实现这种类型的功能,我愿意接受任何建议。

4

7 回答 7

19

之前的答案适用于旧版本的 Ember。经过几次更改,框架已达到 1.0 RC2 版本,并且接近最终版本,因此我决定更新此答案。

例如,请查看此小提琴中定义的路由:http: //jsfiddle.net/schawaska/dWcUp/

这个想法与之前的答案相同,只是方式不同,因为路由 API 发生了很大变化。

下面的 Route 使用activate钩子通过 jQuery 设置文档的标题:

App.ProductRoute = Em.Route.extend({
    activate: function() {
        $(document).attr('title', 'Auto Web Shop - Product');
    }
});

编辑:如评论部分所述:

仅供参考activate是 API 方法,而不是输入- pauldechov


这个答案在之前的 Ember 版本中给出,现在不再适用。

在你的内部connectOutlets,你可以做一些简单的事情,比如使用 jQuery 来修改文档的title属性:

[...]
home: Em.Route.extend({
    route: '/',
    connectOutlets: function (router, context) {                
        // router.set('navbarController.selected', 'home');                     
        router.get('applicationController')
              .connectOutlet('home');                     

        $(document).attr('title', 'YOUR TITLE GOES HERE');
    }
}),                
[...]

但是你必须对每条路线都这样做。

如果您有设置选定导航菜单项的导航栏控制器之类的东西,您可以观察selected属性以将“活动”或“选定”css 类绑定到导航项并设置页面标题;或者您可以在通过上下文的navitem 模型上拥有一个仅用于标题的属性(但我相信您必须在视图中处理此问题并从那里过渡到路线)。

无论如何,这只是为了展示设置页面标题的一种可能方式。

编辑:我已经修改了一个现有的小提琴来做到这一点。看看navigateTo路由器中的方法:http: //jsfiddle.net/schawaska/hEx84/(要查看它运行到这里http://jsfiddle.net/schawaska/hEx84/show/

于 2012-11-27T18:03:18.047 回答
6

由于我努力想出一个很好的模式来设置页面标题,使用最新的 Ember.js (1.0.0 RC7),我决定创建一个子类Ember.Route

AppRoute = Ember.Route.extend({
    renderTemplate: function(controller, model) {
        this.render();

        var pageTitle = this.title ? this.title(controller, model) : null;
        document.title = pageTitle ? pageTitle : "Default Title";
    }
});

// all routes extend this new 'AppRoute'

App.PageRoute = AppRoute.extend({
    model: function(params) {
        // return your model
        return App.Page.find(params.page_id);
    },
    title: function(controller, model) {
        // return whatever should be your page title
        return controller.get('title');
    },
});

如果合并此拉取请求,Ember.js 可能会原生支持这一点:路由器现在观察路由处理程序上的 'title' 属性并设置 document.title注意:controller这个拉取请求似乎没有model作为参数传递。

如果您更喜欢 Coffee Script 等价物:Ember.js:一种设置页面标题的简单明了的方法

于 2013-08-26T09:17:50.077 回答
5

我采用了这种方法:

Ember.Route.reopen({
    enter: function(router) { 
        this._super(router)

        # Set page title
        name = this.parentState.get('name')
        if (!Em.none(name)) {
            capitalizedName = name.charAt(0).toUpperCase() + name.slice(1)
            $(document).attr('title', "Website - " + capitalizedName)
        }
   }
})

使用 navigateTo 时出现了一些问题,至少对于我的情况而言,这最终变得更加可靠和清洁。

于 2013-02-06T20:57:39.870 回答
5

对这个拉取请求进行了长时间的讨论之后,决定这不属于核心。有一个实现该功能的组件和 ember-cli 插件。

于 2015-03-01T19:37:39.350 回答
4

我在 Ember 1.4.0 中使用了以下方法:

App.PageTitle = Ember.Object.create({
    defaultTitle: 'This route has no title defined'
});

RouteWithTitle = Ember.Route.extend({
    activate: function() {
            if ('title' in this){
                document.title = this.title;
                App.PageTitle.set('title',this.title);
            }else{
                document.title = App.PageTitle.defaultTitle;
                App.PageTitle.set('title',this.title);
            }
    }
});

App.ExampleRoute = RouteWithTitle.extend({
    title: 'This is an example route'
});
App.AnotherRoute = RouteWithTitle.extend({
    title: 'This is another route'
});

(类似于 Micha Mazaheri 的回答。)

您可以使用 title 属性为每个路由定义一个标题。页面标题会自动更新,您可以在任何车把模板中使用 {{App.PageTitle.title}} 调用标题

于 2014-04-10T18:20:29.143 回答
1

我有同样的问题。

注意:您可以通过编辑更改起始标题app/index.html

代替简单而有福的方式(我敢肯定,Ember 开发人员正忙于更重要的事情),我发现最优雅的答案来自CodeJack 在这里找到

// file: app/helpers/head-title.js    

import Ember from 'ember';

export function headTitle(title) {
  Ember.$('head').find('title').text(title);
}

export default Ember.Helper.helper(headTitle);

现在在任何视图模板中,您只需添加助手

{{head-title 'View Header'}}

已编辑:Ember 2.0 的更新代码

来源:<head> 标签中的 Ember 车把模板

于 2015-08-22T02:17:11.937 回答
0

在您的路线中快速而肮脏的方法:

actions: {
  didTransition: function() {
    Ember.$('title').text('My awesome page title');      
  }
}
于 2014-08-12T16:03:38.770 回答