如何将多槽transclude作用域设置为指令作用域
How to set the multi-slot transclude scope to directive scope?
我正在尝试构建可以递归使用的多槽指令。
问题是如何将transclude作用域设置为每个transclude插槽的指令作用域
在指令模板中,我使用这样的结构:
<div>
<div ng-tranclude="slot1"></div>
<div ng-tranclude="slot2"></div>
</div>
现在transclude作用域的标准设置为调用链接函数中的transclude:
transclude(scope, function(clone, scope) {
element.append(clone);
});
停止工作。
让指令模板为:
.directive("verticalSplitter", ['$log', function ($log) {
return {
restrict: 'E',
scope: {
width: '=',
height: '=',
split: '=',
minLeft: '=',
minRight: '='
},
transclude: {
leftPane: 'leftPane',
rightPane: 'rightPane'
},
template: '<div style="position:relative; width:{{width}}px; height:{{height}}px;">'
+ '<div style="width:{{splitPosition - 4}}px; height:{{height}}px; position:relative; border: 1px solid black; margin-right: 4px; padding: 4px 4px 4px 4px; display:inline-block;">'
+ '<div style="display:block; overflow:hidden; width:{{splitPosition -12}}px; height:{{height-10}}px; vertical-position:top;" ng-transclude="leftPane"></div>'
+ '</div>'
+ '<div style="position:absolute; left:5px; top:0px; width:{{wsplitPosition -10}}px; bottom:0px; background-color:darkgreen; opacity:0.5; z-index:10000;" ng-show="isMouseDown"></div>'
+ '<div style="position:absolute; left:{{wsplitPosition -2}}px; top:0px; width:4px; bottom:0px; background-color:{{resizeBarColor}}; z-index:10000; cursor:col-resize;" ng-mousedown="resizeMouseDown($event)"></div>'
+ '<div style="position:absolute; left:{{wsplitPosition + 4}}px; top:0px; width:{{width - wsplitPosition -16}}px; bottom:0px; background-color:darkred; opacity:0.5; z-index:10000;" ng-show="isMouseDown"></div>'
+ '<div style="width:{{width - splitPosition - 8}}px; height:{{height}}px; position:relative; border: 1px solid black; margin-right: 4px; padding: 4px 4px 4px 4px; display:inline-block;">'
+ '<div style="display:block; overflow:hidden; vertical-position:top; width:{{width - splitPosition - 16}}px; height:{{height - 10}}px;" **ng-transclude="rightPane"**></div>'
+ '</div>'
+ '</div>',
link: function (scope, element, attrs, controller, transcludeFn) {
scope.splitPosition = scope.split;
scope.wsplitPosition = scope.splitPosition;
scope.resizeBarColor = "transparent";
var startX = 0;
scope.isMouseDown = false;
var updateRL = function () {
scope.widthL = scope.splitPosition - 12;
scope.heightL = scope.height - 10;
scope.widthR = scope.width - scope.splitPosition - 16;
scope.heightR = scope.height - 10;
};
updateRL();
scope.resizeMouseDown = function ($event) {
scope.isMouseDown = true;
scope.resizeBarColor = "dimgray";
startX = $event.screenX;
$(window).on("mousemove", function (event) {
scope.doResize(event);
scope.$apply();
return false;
});
$(window).on("mouseup", function (event) {
$(window).off("mouseup");
$(window).off("mousemove");
scope.resizeMouseUp(event);
scope.$apply();
return false;
});
};
scope.resizeMouseUp = function ($event) {
scope.splitPosition = scope.wsplitPosition;
updateRL();
scope.resizeBarColor = "transparent";
scope.isMouseDown = false;
};
scope.doResize = function ($event) {
if (!scope.isMouseDown)
return;
var ev = $event;
var moveX = (startX - $event.screenX);
if (scope.wsplitPosition - moveX > scope.minLeft && (scope.wsplitPosition - moveX) < scope.width - scope.minRight) {
scope.wsplitPosition -= (startX - $event.screenX);
startX = $event.screenX;
}
return false;
};
}
};
}])
提供插槽名称arg
使用插槽时,您必须指定您感兴趣的内容。
transclude函数签名如下:
transclude([scope], cloneLinkingFn, futureParentElement, slotName)
transclude(scope, function(clone, scope) {
element.append(clone);
}, false, 'slot1');
相关文章:
- 如何为通过ng-view指令或ng-controller指令创建的每个新作用域设置侦听器
- 如何将多槽transclude作用域设置为指令作用域
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 在AngularJS中对指令的隔离作用域设置新属性
- 设置Javascript函数的作用域问题
- 无法在 $.post 回调中设置作用域变量
- 为什么从指令中更改外部作用域需要 scope.$apply(),即使我将范围选项设置为 false
- angular,将变量设置为作用域名称
- 将作用域变量设置为ng repeat中的ng模型
- 如何以正确的方式从服务中设置作用域变量
- 使用this from函数在作用域上获取/设置角度变量
- AngularJS用作用域变量设置ng控制器
- 具有独立作用域的指令中的表单输入:如何将ngModel设置为正确的作用域
- 角度设置基于作用域中变量的动作
- AngularJS指令没有设置第二级作用域对象
- 在angularjs中设置作用域值等于数组元素
- Javascript作用域——包括而不传递或设置为全局
- 显式地将变量作用域设置在函数内而不是闭包内
- 将函数中变量的私有作用域设置为全局,并在javascript中全局访问它
- 不能在将指令作用域设置为false的指令负面影响中从孤立作用域广播