Подтвердить что ты не робот

Как обновить метатеги в AngularJS?

Я разрабатываю приложение, использующее AngularJS. Я хочу обновить метатеги при изменении маршрута.
Как обновить метатеги в AngularJS, которые могут отображаться в "источнике просмотра" на странице?

вот HTML-код -

  <!DOCTYPE html>
    <html ng-app="app">
        <head>
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta name="fragment" content="!" />
            <meta name="title" content="Test App">
            <meta name="description" content="Test App">
            <meta name="keywords" content="Test,App">

            <link rel="stylesheet" href="css/jquery-ui-1.10.2.custom.min.css" />
            <link rel="stylesheet" href="css/extra.css" />
            <script src="js/libs/jquery-1.8.3.min.js"></script>
            <script src="js/libs/jquery-ui-1.10.2.custom.min.js"></script>
            <script src="js/libs/angular.min.js"></script>
            <script src="js/controller.js"></script>
            <script src="js/routes.js"></script>
        </head>
        <body>
            <div ng-controller="mainCtrl" class="main-container" loading>
                <div class="container-holder">
                    <div class="container">
                        <div ng-include src='"elements/header.html"'></div>
                        <div ng-view class="clearfix"></div>
                    </div>
                </div>

                <div ng-controller="userCtrl" id="test">
                    <div class="container" class="login-container">
                        <div id="login-logo">
                            <img src="images/logo-300.png" alt="" class="login-img"/>
                            <br />
                            <div ng-view></div>
                        </div>
                    </div>
                </div>
        </body>
    </html>
4b9b3361

Ответ 1

<html ng-app="app">
    <title ng-bind="metaservice.metaTitle()">Test</title>
    <meta name="description" content="{{ metaservice.metaDescription() }}" />
    <meta name="keywords" content="{{ metaservice.metaKeywords() }}" />


<script>
    var app = angular.module('app',[]);
    app.service('MetaService', function() {
       var title = 'Web App';
       var metaDescription = '';
       var metaKeywords = '';
       return {
          set: function(newTitle, newMetaDescription, newKeywords) {
              metaKeywords = newKeywords;
              metaDescription = newMetaDescription;
              title = newTitle; 
          },
          metaTitle: function(){ return title; },
          metaDescription: function() { return metaDescription; },
          metaKeywords: function() { return metaKeywords; }
       }
    });

   app.controller('myCtrl',function($scope,$rootScope,MetaService){
      $rootScope.metaservice = MetaService;
      $rootScope.metaservice.set("Web App","desc","blah blah");
   });
</script>
 <body ng-controller="myCtrl"></body>


</html>

Ответ 2

Я решил эту проблему примерно 2 дня назад, создав службу и используя $window, а также классический javascript.

В вашей надписи html создайте все необходимые метатеги... (не стесняйтесь оставлять их пустыми на данный момент или вы можете установить их по умолчанию.)

<head> 
    <meta name="title"/>
    <meta name="description"/>
</head>

Затем нам нужно создать такой сервис.

angular.module('app').service('MetadataService', ['$window', function($window){
 var self = this;
 self.setMetaTags = function (tagData){
   $window.document.getElementsByName('title')[0].content = tagData.title;
   $window.document.getElementsByName('description')[0].content = tagData.description;
 }; 
}]);

Теперь нам нужно будет использовать службу self.setMetaTags из контроллера (при инициализации)... вы просто вызовете функцию в любом месте контроллера.

  angular.module('app').controller('TestController', ['MetadataService',function(MetadataService){

   MetadataService.setMetaTags({
       title: 'this',
       description: 'works'
    });

   }]);

Ответ 4

Когда вы просматриваете исходный код в большинстве браузеров, вы видите документ, который был первоначально отправлен с сервера перед любым манипулятором JavaScript с DOM. Приложения AngularJS обычно выполняют много манипуляций с DOM, но никогда не меняют оригинальный документ. Когда вы делаете что-то вроде щелчка правой кнопкой мыши → проверяете элемент в FireFox или Chrome (с помощью инструментов dev), вы увидите рендер DOM, который включает все обновления JavaScript.

Итак, чтобы ответить на ваш вопрос, нет возможности обновить метатег описания с помощью JavaScript, чтобы изменения отражались в "источнике просмотра". Тем не менее, вы можете обновить тег описания метаданных, чтобы все браузерные плагины (например, приложения для заметок и т.д.) Увидели обновленное описание. Для этого вы сделаете что-то вроде этого:

var metaDesc = angular.element($rootElement.find('meta[name=description]')[0]); metaDesc.attr('content', description);

Ответ 5

Я изменил найденный ответ здесь, чтобы сделать эту работу на моем сайте. Вы устанавливаете мета-контент в конфигурации маршрута, а затем привязываете функцию к событию $routeChangeSuccess, чтобы поместить сконфигурированное значение в $rootScope. Пока ваш метатег связан с значением $rootScope, все будет работать так, как планировалось.

angularApp.run(['$rootScope', function ($rootScope) {
    $rootScope.$on('$routeChangeSuccess', function (event, current, previous) {
        $rootScope.title = current.$$route.title;
        $rootScope.description = current.$$route.description;
        $rootScope.keywords = current.$$route.keywords;
    });
 }]);

angularApp.config(function ($routeProvider, $locationProvider) {
    $routeProvider
        .when('/About', {
            templateUrl: 'Features/About/About.html',
            title: 'Here\ the Title',
            description: 'A Nice Description',
            keywords: 'Some, Keywords, Go, Here'
        });

    // use the HTML5 History API
    $locationProvider.html5Mode(true);
    $locationProvider.hashPrefix('!');
});

<head>
    <meta charset="utf-8" />
    <meta name="keywords" content="{{keywords}}"/>
    <meta name="description" content="{{description}}">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="fragment" content="!" />

    <title ng-bind="title">A Placeholder Title</title>
    <link rel="icon" href="/Images/Logo.ico">
    <base href="/" />
    @Styles.Render("~/Content/css")
</head>