我试图编写一个简单的指令来生成(可能)更复杂的 dom 元素。我对这里发生的事情感到很困惑,但我认为我在指令中使用的指令首先被链接?无论如何,我正在生成的元素在它应该出现的地方是不可见的。
对不起,所有的混乱,这里是 plunkr: http ://plnkr.co/edit/vWxTmA1tQ2rz6Z9dJyU9?p=preview
我试图编写一个简单的指令来生成(可能)更复杂的 dom 元素。我对这里发生的事情感到很困惑,但我认为我在指令中使用的指令首先被链接?无论如何,我正在生成的元素在它应该出现的地方是不可见的。
对不起,所有的混乱,这里是 plunkr: http ://plnkr.co/edit/vWxTmA1tQ2rz6Z9dJyU9?p=preview
我认为我在指令中使用的指令首先被链接?
是的。子指令的链接函数将在父指令的链接函数之前执行。
这是一个显示两个嵌套指令的小提琴,
<div d1>
<div d2></div>
</div>
它记录指令的控制器和链接函数何时被调用。
您的 Plunker 存在一些问题:
由于您使用@
的是隔离范围,因此您需要在属性值中使用 {{}}:
<visible value='{{visible}}'>plop</visible>
<invisible value='{{visible}}'>plop</invisible>
由于$scope.visible
在您的控制器中定义,我假设您打算使用该值,而不是test
.
在invisible
指令中,您需要value
在链接函数中使用隔离范围属性。属性visible
可用于嵌入范围(如果您template
在 @Langdon 之类的指令中使用 a 则该属性有效),但隔离范围不可用,这是链接函数所看到的。
var template = "<span ng-show='value'>{{value}}</span>";
笨蛋。
如果你想要一个简单的指令,你最好让 Angular 通过ngTransclude
, 和$watch
.
http://plnkr.co/edit/xYTNIUKYuHWhTrK80qKJ?p=preview
HTML:
<!doctype html>
<html ng-app="app">
<head>
<meta charset="utf-8">
<title>trying to compile stuff</title>
<script src="http://code.angularjs.org/1.1.1/angular.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="AppCtrl">
<input type="checkbox" ng-model="test" id="test" /><label for="test">Visibility (currently {{test}})</label>
<br />
<br />
<visible value='test'>visible tag</visible>
<invisible value='test'>invisible tag</invisible>
</div>
</body>
</html>
JavaScript:
angular
.module('app', [])
.controller('AppCtrl', function($scope) {
$scope.test = false;
})
.directive('visible', function() {
return {
restrict: 'E',
transclude: true,
template: '<span ng-transclude></span>',
replace: true,
scope: {
value: '='
},
link: function(scope, element, attrs) {
console.log(attrs);
scope.$watch('value', function (value) {
element.css('display', value ? '' : 'none');
});
console.log(attrs.value);
}
};
})
.directive('invisible', function() {
return {
restrict: 'E',
transclude: true,
template: '<span ng-transclude></span>',
replace: true,
scope: {
value: '='
},
link: function(scope, element, attrs) {
scope.$watch('value', function (value) {
element.css('display', value ? 'none' : '');
});
}
};
});