(潜在的に) より複雑な dom 要素を生成するための単純なディレクティブを作成しようとしていました。ここで何が起こっているのかかなり混乱していますが、ディレクティブ内で使用するディレクティブが最初にリンクされると思いますか? とにかく、私が生成している要素は、本来あるべき場所に表示されません。
混乱してすみません。plunkr は次のとおりです: http://plnkr.co/edit/vWxTmA1tQ2rz6Z9dJyU9?p=preview
(潜在的に) より複雑な dom 要素を生成するための単純なディレクティブを作成しようとしていました。ここで何が起こっているのかかなり混乱していますが、ディレクティブ内で使用するディレクティブが最初にリンクされると思いますか? とにかく、私が生成している要素は、本来あるべき場所に表示されません。
混乱してすみません。plunkr は次のとおりです: http://plnkr.co/edit/vWxTmA1tQ2rz6Z9dJyU9?p=preview
ディレクティブ内で使用するディレクティブが最初にリンクされると思いますか?
はい。子ディレクティブのリンク関数は、親のリンク関数の前に実行されます。
これは、ネストされた 2 つのディレクティブを示すフィドルです。
<div d1>
<div d2></div>
</div>
ディレクティブのコントローラーとリンク関数が呼び出されたときにログに記録します。
Plunker にはいくつかの問題があります。
分離スコープに使用@
しているため、属性値に {{}} を使用する必要があります。
<visible value='{{visible}}'>plop</visible>
<invisible value='{{visible}}'>plop</invisible>
はコントローラーで定義されているため$scope.visible
、 ではなくその値を使用するつもりだったと思いますtest
。
ディレクティブでは、リンク関数でinvisible
アイソレート スコープ プロパティを使用する必要があります。value
プロパティは、transcluded スコープ ( @Langdon のようにディレクティブでvisible
a を使用する場合に影響します) で使用できますが、リンク関数が認識する分離スコープでは使用できません。template
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' : '');
});
}
};
});