【发布时间】:2014-04-07 16:48:28
【问题描述】:
我正在编写一个可重用的模态指令,但嵌入的元素会创建自己的范围。这是该问题的JSFIDDLE。这是它的工作原理。
<button ng-click="show=!show">Show Modal</button>
<modal visible="show">
<button ng-click="show=!show">X</button>
</modal>
请注意,显示它的按钮有效,但 X 并没有关闭它,因为内部按钮被嵌入并创建了自己的范围。有没有办法将嵌入的范围链接到指令的当前范围?或者只是阻止它创建自己的范围?这是指令。
.directive('modal', function($compile) {
return {
restrict: 'E',
template: "<div ng-style='bgstyling()' ng-transclude></div>",
transclude: true,
link: function(scope, elem, attrs) {
scope.$watch(attrs.visible, function(val) {
elem[0].style.visibility = val ? 'visible' : 'hidden';
});
scope.bgstyling = function() {
return {
'position': 'fixed',
'top': '0',
'left': '0',
'bottom': '0',
'right': '0',
'backgroundColor': attrs.bgColor || '#000',
'opacity': attrs.opacity || '0.85'
}
}
}
}
})
* 更新 *
我认为答案可能与链接函数的transclude函数参数有关。这是我刚刚尝试过的,但仍然无法正常工作。
link: function(scope, elem, attrs, nullC, transclude) {
transclude(scope, function(clone) {
elem.append($compile(clone)(scope));
});
...
【问题讨论】:
-
我认为
X正在从孤立的指令范围中获取范围。但是在 html 中设置show没有影响,因为指令范围属性名称是ngModalShow -
@Chandermani,是的,这只是我提出的快速示例。现在看看。我希望在 scope.show 更改时更改可见性。我认为关键可能是链接的 transcludeFn,但我看不到它是如何工作的。
标签: angularjs