可以在 HTML 标签之外使用指令吗?
Can directives be used outside of HTML tags?
自从几个月前学习 Angular 以来,我的印象是 ` 指令 是通过在 [=41] 中放置关键字来激活的特殊功能=] 以两种方式之一标记 - 作为元素,作为属性。
例如:
<my-directive>Something</my-directive>
或
<div my-directive></div>
但是,in a Git project I came across,我看到一个指令以完全不同的方式使用,我不明白它是如何工作的。
该指令应该通过将 css: {}
的键值添加到 ui-router 中的 .state()
函数来激活。
例如:
.state('state1', {
url: '/state',
controller: 'StateCtrl',
templateUrl: 'views/my-template.html',
data: {
css: 'styles/style1.css'
}
})
这个"directive"是如何工作的?
------------
从Git项目复制的指令的Javascript源码,所以保留在这个问题中:
/**
* @author Manuel Mazzuola
* https://github.com/manuelmazzuola/angular-ui-router-styles
* Inspired by https://github.com/tennisgent/angular-route-styles
*/
'use strict';
angular
.module('uiRouterStyles', ['ui.router'])
.directive('head', ['$rootScope', '$compile', '$state', '$interpolate',
function($rootScope, $compile, $state, $interpolate) {
return {
restrict: 'E',
link: function(scope, elem){
var start = $interpolate.startSymbol(),
end = $interpolate.endSymbol();
var html = '<link rel="stylesheet" ng-repeat="(k, css) in routeStyles track by k" ng-href="' + start + 'css' + end + '" >';
elem.append($compile(html)(scope));
// Get the parent state
var $$parentState = function(state) {
// Check if state has explicit parent OR we try guess parent from its name
var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1];
// If we were able to figure out parent name then get this state
return name && $state.get(name);
};
scope.routeStyles = [];
$rootScope.$on('$stateChangeStart', function (evt, toState) {
// From current state to the root
scope.routeStyles = [];
for(var state = toState; state && state.name !== ''; state=$$parentState(state)) {
if(state && state.data && state.data.css) {
if(!Array.isArray(state.data.css)) {
state.data.css = [state.data.css];
}
angular.forEach(state.data.css, function(css) {
if(scope.routeStyles.indexOf(css) === -1) {
scope.routeStyles.push(css);
}
});
}
}
scope.routeStyles.reverse();
});
}
};
}
]);
该指令以 HTML <head>
标记命名。它假定您的 html 页面包含一个 <head>
标记并将其视为您的指令声明。它还假定 angular ng-app
声明放在 <html>
标记上。
该指令除了在每次状态更改时在 html head 标记内容中擦除和写入 css <link>
标记外什么都不做。
请注意,最好不要使用原生 html 标记来命名指令。这就是为什么您看到 angular 指令前面有 'ng' 以便清楚地将它们划分为 angular 标记。否则,它可能会导致混淆,因为您在尝试理解这段 git 代码时已经发现了这一点。
自从几个月前学习 Angular 以来,我的印象是 ` 指令 是通过在 [=41] 中放置关键字来激活的特殊功能=] 以两种方式之一标记 - 作为元素,作为属性。
例如:
<my-directive>Something</my-directive>
或
<div my-directive></div>
但是,in a Git project I came across,我看到一个指令以完全不同的方式使用,我不明白它是如何工作的。
该指令应该通过将 css: {}
的键值添加到 ui-router 中的 .state()
函数来激活。
例如:
.state('state1', {
url: '/state',
controller: 'StateCtrl',
templateUrl: 'views/my-template.html',
data: {
css: 'styles/style1.css'
}
})
这个"directive"是如何工作的?
------------
从Git项目复制的指令的Javascript源码,所以保留在这个问题中:
/**
* @author Manuel Mazzuola
* https://github.com/manuelmazzuola/angular-ui-router-styles
* Inspired by https://github.com/tennisgent/angular-route-styles
*/
'use strict';
angular
.module('uiRouterStyles', ['ui.router'])
.directive('head', ['$rootScope', '$compile', '$state', '$interpolate',
function($rootScope, $compile, $state, $interpolate) {
return {
restrict: 'E',
link: function(scope, elem){
var start = $interpolate.startSymbol(),
end = $interpolate.endSymbol();
var html = '<link rel="stylesheet" ng-repeat="(k, css) in routeStyles track by k" ng-href="' + start + 'css' + end + '" >';
elem.append($compile(html)(scope));
// Get the parent state
var $$parentState = function(state) {
// Check if state has explicit parent OR we try guess parent from its name
var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1];
// If we were able to figure out parent name then get this state
return name && $state.get(name);
};
scope.routeStyles = [];
$rootScope.$on('$stateChangeStart', function (evt, toState) {
// From current state to the root
scope.routeStyles = [];
for(var state = toState; state && state.name !== ''; state=$$parentState(state)) {
if(state && state.data && state.data.css) {
if(!Array.isArray(state.data.css)) {
state.data.css = [state.data.css];
}
angular.forEach(state.data.css, function(css) {
if(scope.routeStyles.indexOf(css) === -1) {
scope.routeStyles.push(css);
}
});
}
}
scope.routeStyles.reverse();
});
}
};
}
]);
该指令以 HTML <head>
标记命名。它假定您的 html 页面包含一个 <head>
标记并将其视为您的指令声明。它还假定 angular ng-app
声明放在 <html>
标记上。
该指令除了在每次状态更改时在 html head 标记内容中擦除和写入 css <link>
标记外什么都不做。
请注意,最好不要使用原生 html 标记来命名指令。这就是为什么您看到 angular 指令前面有 'ng' 以便清楚地将它们划分为 angular 标记。否则,它可能会导致混淆,因为您在尝试理解这段 git 代码时已经发现了这一点。