angular-material-npfixed
Version:
The Angular Material project is an implementation of Material Design in Angular.js. This project provides a set of reusable, well-tested, and accessible Material Design UI components. Angular Material is supported internally at Google by the Angular.js, M
120 lines (108 loc) • 3.25 kB
JavaScript
/**
* @ngdoc service
* @name $$mdMeta
* @module material.core.meta
*
* @description
*
* A provider and a service that simplifies meta tags access
*
* Note: This is intended only for use with dynamic meta tags such as browser color and title.
* Tags that are only processed when the page is rendered (such as `charset`, and `http-equiv`)
* will not work since `$$mdMeta` adds the tags after the page has already been loaded.
*
* ```js
* app.config(function($$mdMetaProvider) {
* var removeMeta = $$mdMetaProvider.setMeta('meta-name', 'content');
* var metaValue = $$mdMetaProvider.getMeta('meta-name'); // -> 'content'
*
* removeMeta();
* });
*
* app.controller('myController', function($$mdMeta) {
* var removeMeta = $$mdMeta.setMeta('meta-name', 'content');
* var metaValue = $$mdMeta.getMeta('meta-name'); // -> 'content'
*
* removeMeta();
* });
* ```
*
* @returns {$$mdMeta.$service}
*
*/
angular.module('material.core.meta', [])
.provider('$$mdMeta', function () {
var head = angular.element(document.head);
var metaElements = {};
/**
* Checks if the requested element was written manually and maps it
*
* @param {string} name meta tag 'name' attribute value
* @returns {boolean} returns true if there is an element with the requested name
*/
function mapExistingElement(name) {
if (metaElements[name]) {
return true;
}
var element = document.getElementsByName(name)[0];
if (!element) {
return false;
}
metaElements[name] = angular.element(element);
return true;
}
/**
* @ngdoc method
* @name $$mdMeta#setMeta
*
* @description
* Creates meta element with the 'name' and 'content' attributes,
* if the meta tag is already created than we replace the 'content' value
*
* @param {string} name meta tag 'name' attribute value
* @param {string} content meta tag 'content' attribute value
* @returns {function} remove function
*
*/
function setMeta(name, content) {
mapExistingElement(name);
if (!metaElements[name]) {
var newMeta = angular.element('<meta name="' + name + '" content="' + content + '"/>');
head.append(newMeta);
metaElements[name] = newMeta;
}
else {
metaElements[name].attr('content', content);
}
return function () {
metaElements[name].attr('content', '');
metaElements[name].remove();
delete metaElements[name];
};
}
/**
* @ngdoc method
* @name $$mdMeta#getMeta
*
* @description
* Gets the 'content' attribute value of the wanted meta element
*
* @param {string} name meta tag 'name' attribute value
* @returns {string} content attribute value
*/
function getMeta(name) {
if (!mapExistingElement(name)) {
throw Error('$$mdMeta: could not find a meta tag with the name \'' + name + '\'');
}
return metaElements[name].attr('content');
}
var module = {
setMeta: setMeta,
getMeta: getMeta
};
return angular.extend({}, module, {
$get: function () {
return module;
}
});
});