使用MEAN堆栈的动态页面标题 - Jade和Angular

时间:2014-01-26 09:30:12

标签: node.js angularjs express pug mean-stack

在我的MEAN堆栈应用程序中,我正在尝试根据页面上加载的内容更改页面标题(在jade中设置)。目前,它为SPA中的每个页面显示通用页面标题。

设置我正在执行此操作的索引的页面标题

index.js

 res.render('index', {
    title: 'Generic Page Title'
});

然后,当我返回内容(不同的角度路线/页面)时,我想更新此标题

offers.js

Offer.find(searchObject).sort('-pricing.pctSavings').exec(function(err, offers){
  if (err) {
    res.render('error', {
      status: 500
    });
  } else {
    //update title?
    res.jsonp(offers);
  }
});

head.jade

title= appName+' - '+title

我不确定如何更改此项,因为商品在页面中以json的形式返回。我已经尝试将标题添加到响应中(res.locals.title ='测试唯一标题')但它不起作用。

有什么想法吗?

谢谢!

添加更多信息:

我可以在jade模板中包含一些html,如下所示:

head.jade

 head
   div(data-ng-include="'views/dynamic_title.html'")
   meta(charset='utf-8')
   meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1')
   meta(name='viewport', content='width=device-width,initial-scale=1,user-scalable=no')

视图/ dynamic_title.html

<div data-ng-controller="OffersController">
    <title> Test </title> //works
    <title> {{test}} </title> //test set in offers controller - doesn't work
    <title> {{ Page.title() }}</title> //Page injected into offers controller - doesn't work
</div>

优惠控制器直到稍后才加载......

感谢。

3 个答案:

答案 0 :(得分:3)

据我所知,每次请求命中服务器时,您都不会返回jade文件。由于SPA使用angularjs,您的应用程序会从服务器加载按需数据。您必须更改角度js代码中的标题。

<强> HMTL

<html ng-app="app">
   <head ng-controller="TitleCtrl">
     <title>{{ Page.title() }}</title>
    </head>
    ....
</html>

<强> JS

angular.module('app', [])
.factory('Page', function() {
   var title = 'default';
   return {
     title: function() { return title; },
     setTitle: function(newTitle) { title = newTitle }
   };
})
.controller('TitleCtrl', function($scope, Page) {
    $scope.Page = Page;
})
.controller('RouterPathCtrl', function($scope, Page) {
    Page.setTitle('My new title')
});

每当路线改变时,

Inject `Page` and Call `Page.setTitle()` from controllers.

答案 1 :(得分:1)

我认为实现此目的的一种方法是将当前页面标题作为标题发送给您的响应,因此您不必将不相关的信息放入您的JSON模型中。

res.set("title", "some title");

API

然后我使用请求拦截器和指令的组合,我会读出标题并根据该标题字段更新标题标记。

module.factory("Page", function() {
  return {
    title: "index"
  }
});
module.directive("title", ["Page",
  function(Page) {

    return {
      restrict:"E",
      link: function($scope, $element) {
        $scope.$watch(function() {
          return Page.title;
        }, function(newValue) {
          $element.html(newValue);
        })
      }
    }
  }
]);
module.factory("PageTitleInterceptor", ["Page",
  function(Page) {
    return {
      response: function(response) {
        Page.title = response.headers("title");
        return response;
      }
    }
  }
]);

看到Plunk http://plnkr.co/edit/ZNSUnqJkGXdTv9MfERYF?p=preview 使用firebug,您可以观察标题标签

问候

答案 2 :(得分:1)

您可以使用MEAN堆栈中AngularJS控制器内部的javascript更改页面标题。

简单地运行

document.title = "Current Page Title";

在每个控制器的开头。