46

我的网站将有多个部分,我打算调整每个部分的大小。为了做到这一点,我制定了一个“可调整大小”的指令,例如:

<div class="workspace" resize="full" ng-style="resizeStyle()">
<div class="leftcol" resize="left" ng-style="resizeStyle()">

使用如下所示的指令:

lwpApp.directive('resize', function ($window) {
    return {
        scope: {},

        link: function (scope, element, attrs) {
            scope.getWinDim = function () {
                return {
                    'height': window.height(),
                    'width': window.width()
                };
            };

            // Get window dimensions when they change and return new element dimensions
            // based on attribute
            scope.$watch(scope.getWinDim, function (newValue, oldValue) {
                scope.resizeStyle = function () {
                    switch (attrs.resize) {
                    case 'full':
                        return {
                            'height': newValue.height,
                            'width': (newValue.width - dashboardwidth)
                        };

                    case 'left':
                        return {
                            'height': newValue.height,
                            'width': (newValue.width - dashboardwidth - rightcolwidth)
                        };

                    etc...
                };
            }, true);

            //apply size change on window resize
            window.bind('resize', function () {
                scope.$apply(scope.resizeStyle);
            });
        }
    };
});

如您所见,这只在窗口调整大小时调整每个 div 的大小,并且每个指令都有一个隔离范围。这适用于它的构建目标,但最终我想通过可拖动栏使 div 的子集可调整大小。例如

div1     div2
----------------
|     ||       |
|     ||       |
|     ||       |
|     ||       |
----------------
    draggable bar in middle

在可拖动条的移动(水平方向)上,我可能需要通过父控制器的范围访问 div1、div2 的宽度(?)。我的问题是:

  1. 这是以角度制作可调整大小的div的“正确”方法吗?特别是,当一个 div 的大小影响另一个时?

  2. 我个人觉得 (1) 的答案是“不,我没有正确执行它,因为当每个指令都有一个隔离范围时,我无法在指令之间进行通信。” 如果这是真的,我该如何考虑 div 之间的窗口和可拖动调整大小?

4

4 回答 4

99

这个问题很老,但对于任何寻找解决方案的人,我构建了一个简单的指令来处理这个问题,用于垂直和水平调整大小。

看看Plunker

在此处输入图像描述

angular.module('mc.resizer', []).directive('resizer', function($document) {

    return function($scope, $element, $attrs) {

        $element.on('mousedown', function(event) {
            event.preventDefault();

            $document.on('mousemove', mousemove);
            $document.on('mouseup', mouseup);
        });

        function mousemove(event) {

            if ($attrs.resizer == 'vertical') {
                // Handle vertical resizer
                var x = event.pageX;

                if ($attrs.resizerMax && x > $attrs.resizerMax) {
                    x = parseInt($attrs.resizerMax);
                }

                $element.css({
                    left: x + 'px'
                });

                $($attrs.resizerLeft).css({
                    width: x + 'px'
                });
                $($attrs.resizerRight).css({
                    left: (x + parseInt($attrs.resizerWidth)) + 'px'
                });

            } else {
                // Handle horizontal resizer
                var y = window.innerHeight - event.pageY;

                $element.css({
                    bottom: y + 'px'
                });

                $($attrs.resizerTop).css({
                    bottom: (y + parseInt($attrs.resizerHeight)) + 'px'
                });
                $($attrs.resizerBottom).css({
                    height: y + 'px'
                });
            }
        }

        function mouseup() {
            $document.unbind('mousemove', mousemove);
            $document.unbind('mouseup', mouseup);
        }
    };
});
于 2014-03-07T14:43:57.743 回答
20

我知道我参加聚会有点晚了,但我发现了这一点并且需要我自己的解决方案。如果您正在寻找一个适用于 flexbox 且不使用 jquery 的指令。我在这里扔了一个:

http://codepen.io/Reklino/full/raRaXq/

只需声明您希望元素调整大小的方向,以及您是否使用 flexbox(默认为 false)。

<section resizable r-directions="['right', 'bottom']" r-flex="true">
于 2015-03-27T14:17:16.660 回答
3

为了我的项目的需要,我添加了对最小值的支持,以便面板可以保持一些宽度或高度 - (这里是要点) - Github

此外,我创建了Github 存储库,在其中添加了对位于主页面轴右侧的面板的支持以及对最小/最大值的支持。它现在处于示例阶段,但我愿意将它变成一个完整的 Angular 指令

于 2015-07-31T20:10:47.440 回答
0

这并没有完全回答这个问题,但改变scope: true解决了隔离范围问题。特别是,在我的 html 中,我有:

<div ng-controller="WorkspaceCtrl">
  <div class="workspace" resize="full" ng-style="resizeStyle()">
    <div class="leftcol" resize="left" ng-style="resizeStyle()">
      <ul class="filelist">
        <li ng-repeat="file in files" id={{file.id}} ng-bind=file.name></li>
      </ul>
      <div contenteditable="true" ng-model="content" resize="editor" ng-style="resizeStyle()">
        Talk to me
      </div>
    </div>
</div>

并且ng-repeat="file in files"仍然可以访问$scope.files控制器 WorkspaceCtrl 中定义的数组。所以scope: {}从父控制器的范围中切断指令的范围,而scope: true简单地为指令的每个实例创建一个新的范围,并且指令的每个实例及其子级都保留对父范围的访问。

我还没有实现调整这些 div 大小的可拖动栏,但是当我这样做时会报告。

于 2013-08-22T16:07:34.780 回答