1

я написал некоторую логику в моих контроллеров, чтобы вставить мои приложения мета-данные:AngularJS Директива читать текущий templateURL

HTML:

html ng-app="myApp" ng-controller="MainController" 

meta name="description" content="{{ seo.metaDescription }}" 

JS:

var app = angular.module('myApp', ['ngRoute']); 

app.config(["$routeProvider", "$locationProvider", function($routeProvider, $locationProvider){ 
    $routeProvider 
     .when("/", { 
      templateUrl: "page1.html", 
      controller: "Page1Controller" 
     }) 
     .when("/ledlighting", { 
      templateUrl: "page2.html", 
      controller: "Page2Controller" 
     }) 
     // .otherwise({ redirectTo: '/'}) 
     ; 
}]); 
app.controller('MainController', ["$scope", function($scope) { 

    $scope.seo = { 
     metaDescription : '' 
    }; 

}]); 
app.controller('Page1Controller', ["$scope", function($scope) { 

    console.log("Greetings from controller 1"); 

    $scope.$parent.seo = { 
     metaDescription: 'My SEO Meta Description' 
    }; 

}]); 

Вышеприведенные работы прекрасно, однако, вместо того, чтобы писать значения SEO в каждом контроллере, могу ли я написать директива? Могут ли директивы определять, какой/какой текущий маршрут?

По сути, я хочу заменить свои метатеги на директивы и вставить содержимое/описания на основе текущего маршрута.

ответ

1

Вместо директивы я бы предложил более простой подход: непосредственно прочитать информацию о конфигурации маршрута.

Для этого вам нужно хранить сео данные в маршрутной конфигурации:

$routeProvider 
    .when("/", { 
     templateUrl: "page1.html", 
     controller: "Page1Controller", 
     seo: { 
      metaDescription: "My SEO Meta Description" 
     } 
    }) 

, а затем в перспективе блока приложения вы можете добавить $routeChangeSuccess прослушиватель события, который будет установлен $rootScope.seo на основе текущей $route:

app.run(['$rootScope', '$route', function($rootScope, $route) { 
    $rootScope.$on('$routeChangeSuccess', function(newVal, oldVal) { 
     if (oldVal !== newVal) { 
      $rootScope.seo = $route.current.seo; 
     } 
    }); 
}]); 

Демо:http://plnkr.co/edit/fzm6FknfOO8I6vdAO39g?p=preview

+0

Спасибо. Имеет смысл и является простым решением. ЕСЛИ мне нужно идти по директивному маршруту, как это можно достичь? –

+1

Ну, вы можете * написать директиву, но это имеет меньшее значение. В этом случае это не задание для директивы. Проверьте одно возможное решение. http://plnkr.co/edit/6OoIvw1dGvp57Nz31Kt0?p=preview – dfsq

+0

Правильно ли указана ваша вторая ссылка? Кажется, это не директивная версия. –

Смежные вопросы