この最初のものは、何かがDOMに1回だけ存在する必要があるかどうかを評価し、ページにウォッチリスナーを追加しないディレクティブです。
angular.module('setIf',[]).directive('setIf',function () {
return {
transclude: 'element',
priority: 1000,
terminal: true,
restrict: 'A',
compile: function (element, attr, linker) {
return function (scope, iterStartElement, attr) {
if(attr.waitFor) {
var wait = scope.$watch(attr.waitFor,function(nv,ov){
if(nv) {
build();
wait();
}
});
} else {
build();
}
function build() {
iterStartElement[0].doNotMove = true;
var expression = attr.setIf;
var value = scope.$eval(expression);
if (value) {
linker(scope, function (clone) {
iterStartElement.after(clone);
clone.removeAttr('set-if');
clone.removeAttr('wait-for');
});
}
}
};
}
};
});
この2つ目は、ウォッチリスナーなしで1回だけ要素に属性を条件付きで適用するディレクティブです。
すなわち
<div set-attr="{ data-id : post.id, data-name : { value : post.name, condition : post.name != 'FOO' } }"></div>
angular.module('setAttr',[]).directive('setAttr', function() {
return {
restrict: 'A',
priority: 100,
link: function(scope,elem,attrs) {
if(attrs.setAttr.indexOf('{') != -1 && attrs.setAttr.indexOf('}') != -1) {
//you could just angular.isObject(scope.$eval(attrs.setAttr)) for the above but I needed it this way
var data = scope.$eval(attrs.setAttr);
angular.forEach(data, function(v,k){
if(angular.isObject(v)) {
if(v.value && v.condition) {
elem.attr(k,v.value);
elem.removeAttr('set-attr');
}
} else {
elem.attr(k,v);
elem.removeAttr('set-attr');
}
});
}
}
}
});
もちろん、Angularに組み込まれた動的バージョンを使用できます。
<div ng-class="{ 'myclass' : item.iscool }"></div>
新しいngを使用することもできます-基本的にuiを置き換えるangularjsによって追加された場合-angularuiチームによって作成された場合、これらは条件付きでDOMに追加および削除し、監視リスナーを追加して評価を続けます。
<div ng-if="item.iscool"></div>