AngularJS Masonry 用于动态改变高度

2023-12-31

我有点击时会展开和收缩的 div。 Masonry 库对于初始化页面非常有效。我遇到的问题是,通过 Masonry 和下面的指令进行绝对定位,当 div 展开时,它们会与下面的 div 重叠。我需要将扩展​​ div 下面的 div 向下移动以处理扩展。

我的资料来源是:http://masonry.desandro.com/ http://masonry.desandro.com/

and

https://github.com/passy/angular-masonry/blob/master/src/angular-masonry.js https://github.com/passy/angular-masonry/blob/master/src/angular-masonry.js

/*!
* angular-masonry <%= pkg.version %>
* Pascal Hartig, weluse GmbH, http://weluse.de/
* License: MIT
*/
(function () {
  'use strict';

angular.module('wu.masonry', [])
.controller('MasonryCtrl', function controller($scope, $element, $timeout) {
  var bricks = {};
  var schedule = [];
  var destroyed = false;
  var self = this;
  var timeout = null;

  this.preserveOrder = false;
  this.loadImages = true;

  this.scheduleMasonryOnce = function scheduleMasonryOnce() {
    var args = arguments;
    var found = schedule.filter(function filterFn(item) {
      return item[0] === args[0];
    }).length > 0;

    if (!found) {
      this.scheduleMasonry.apply(null, arguments);
    }
  };

  // Make sure it's only executed once within a reasonable time-frame in
  // case multiple elements are removed or added at once.
  this.scheduleMasonry = function scheduleMasonry() {
    if (timeout) {
      $timeout.cancel(timeout);
    }

    schedule.push([].slice.call(arguments));

    timeout = $timeout(function runMasonry() {
      if (destroyed) {
        return;
      }
      schedule.forEach(function scheduleForEach(args) {
        $element.masonry.apply($element, args);
      });
      schedule = [];
    }, 30);
  };

  function defaultLoaded($element) {
    $element.addClass('loaded');
  }

  this.appendBrick = function appendBrick(element, id) {
    if (destroyed) {
      return;
    }

    function _append() {
      if (Object.keys(bricks).length === 0) {
        $element.masonry('resize');
      }
      if (bricks[id] === undefined) {
        // Keep track of added elements.
        bricks[id] = true;
        defaultLoaded(element);
        $element.masonry('appended', element, true);
      }
    }

    function _layout() {
      // I wanted to make this dynamic but ran into huuuge memory leaks
      // that I couldn't fix. If you know how to dynamically add a
      // callback so one could say <masonry loaded="callback($element)">
      // please submit a pull request!
      self.scheduleMasonryOnce('layout');
    }

    if (!self.loadImages){
      _append();
      _layout();
    } else if (self.preserveOrder) {
      _append();
      element.imagesLoaded(_layout);
    } else {
      element.imagesLoaded(function imagesLoaded() {
        _append();
        _layout();
      });
    }
  };

  this.removeBrick = function removeBrick(id, element) {
    if (destroyed) {
      return;
    }

    delete bricks[id];
    $element.masonry('remove', element);
    this.scheduleMasonryOnce('layout');
  };

  this.destroy = function destroy() {
    destroyed = true;

    if ($element.data('masonry')) {
      // Gently uninitialize if still present
      $element.masonry('destroy');
    }
    $scope.$emit('masonry.destroyed');

    bricks = [];
  };

  this.reload = function reload() {
    $element.masonry();
    $scope.$emit('masonry.reloaded');
  };


}).directive('masonry', function masonryDirective() {
  return {
    restrict: 'AE',
    controller: 'MasonryCtrl',
    link: {
      pre: function preLink(scope, element, attrs, ctrl) {
        var attrOptions = scope.$eval(attrs.masonry || attrs.masonryOptions);
        var options = angular.extend({
          itemSelector: attrs.itemSelector || '.masonry-brick',
          columnWidth: parseInt(attrs.columnWidth, 10) || attrs.columnWidth
        }, attrOptions || {});
        element.masonry(options);
        var loadImages = scope.$eval(attrs.loadImages);
        ctrl.loadImages = loadImages !== false;
        var preserveOrder = scope.$eval(attrs.preserveOrder);
        ctrl.preserveOrder = (preserveOrder !== false && attrs.preserveOrder !== undefined);

        scope.$emit('masonry.created', element);
        scope.$on('$destroy', ctrl.destroy);
      }
    }
  };
}).directive('masonryBrick', function masonryBrickDirective() {
  return {
    restrict: 'AC',
    require: '^masonry',
    scope: true,
    link: {
      pre: function preLink(scope, element, attrs, ctrl) {
        var id = scope.$id, index;

        ctrl.appendBrick(element, id);
        element.on('$destroy', function () {
          ctrl.removeBrick(id, element);
        });

        scope.$on('masonry.reload', function () {
          ctrl.scheduleMasonryOnce('reloadItems');
          ctrl.scheduleMasonryOnce('layout');
        });

        scope.$watch('$index', function () {
          if (index !== undefined && index !== scope.$index) {
            ctrl.scheduleMasonryOnce('reloadItems');
            ctrl.scheduleMasonryOnce('layout');
          }
          index = scope.$index;
        });
      }
    }
  };
});
}());

与许多非 Angular 库一样,答案似乎在于将库包装在 Angular 指令中。

我还没有尝试过,但看来就是这样这个人做了 https://github.com/passy/angular-masonry

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS Masonry 用于动态改变高度 的相关文章

随机推荐

  • 如何在 Blogger 帖子中嵌入 Google Drive 文档 (PDF)?

    我想将 Google 云端硬盘中的 pdf 文档嵌入到我的 Blogger 帖子中 选择您要嵌入的 pdf 文件 右键单击 gt Preview gt 更多操作 gt 在新窗口中打开 现在点击更多操作 gt 嵌入项目 复制嵌入代码并将其粘贴
  • 当未提供 COM+ dll 时,从 COM+ dll 获取 IDL(用于 TLB)

    我有一个 dll 其中包含一些带有特定 自定义接口进行查询的 directshow 过滤器 COM 大多数第 3 方 directshow 组件包含嵌入式 tlb 文件 可用于跨环境通信 C typelib 导入 我不想尝试手动创建 c 所
  • 如何在 UIWebView 加载其内容时显示加载消息?

    当 UIWebView 加载其内容时 我想放置一个大旋转器以及 正在加载消息 或 gif 图像 这样它就不会只显示空白视图 我该怎么做呢 实现 UIWebview 的委托方法 将这段代码放入其中 void webViewDidStartLo
  • 如何在Windows中使用批处理替换子字符串来重命名文件[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想重命名文件名 例如 how to
  • 如何在Python plt中获取最近绘制的线的颜色

    我绘制一条线而不指定颜色 想想 plt plot x y 假设颜色是蓝色的 问题 如何从 plt 对象获取此颜色 以便将其放入变量中 看起来这很接近 并且可能是解决方案 p plt plot x y color p 0 get color
  • 在 Windows 上的 RStudio 中构建并重新加载:devtools::document() 表示未找到 devtools

    当我在 RStudio 中的 构建 选项卡上单击 构建并重新加载 时 出现以下错误 gt devtools document roclets c rd collate namespace Error in loadNamespace nam
  • 为什么此日志记录配置不打印到标准输出?

    LOGGING version 1 disable existing loggers True formatters verbose format levelname s asctime s module s process d threa
  • MySQL Sum 列 IF ID 在另一个表查询中

    编辑 我以为我已经有了 但下面的似乎不起作用 看起来它汇总了数据库中的所有内容 SELECT SUM drivetime AS drivetime record id FROM workforce WHERE EXISTS SELECT F
  • 使用findnext填充多维数组VBA Excel

    我的问题实际上涉及一个延伸到的问题EXCEL VBA 将搜索结果存储在数组中 https stackoverflow com questions 11312226 excel vba store search results in an a
  • DyLimit 用于 Dygraphs 中的有限时间

    我正在尝试画一个dygraph plot 条形图感谢答案使用 dygraphs 包在 R 中创建条形图 https stackoverflow com questions 29698255 create a barplot in r usi
  • 将 GridView 绑定到 Dynamic 或 ExpandoObject 对象

    我正在使用 Rob Conery 的 Massive ORM 但无法绑定结果ExpandoObject to a GridView 我确实发现了另一个 Stackoverflow 问题 建议使用一个名为 impromptu 的框架 但我不确
  • 如何在运行时动态创建控件

    我试图根据正在查看的特定工作表上的列数在 Excel 用户窗体中创建可变数量的控件 组合框 理想情况下 我想在运行时删除现有的并创建新的 而不是创建 100 个左右 然后在可见和不可见之间来回切换 我现在所拥有的将创建一个组合框和循环 但它
  • 已在 StoreKit 中购买订阅

    我在 iOS 应用程序的应用程序购买中使用可更新订阅 当用户尝试购买已付款的订阅时 iTunes 会显示一条消息 您当前已订阅此内容 我如何检测此事件何时发生 以便我可以处理交易并授予对我的应用程序的访问权限 在观察者的 paymentQu
  • 将 IS 上的所有 DTS 包导出到文件系统的脚本

    是否有一个脚本可以将 Integration Services 服务器上的所有 DTS 包导出到一个文件系统路径 即 C DTSPackages 目前 如果脚本存在 右键单击 选择导出 选择文件系统的任务似乎有些多余 但我发现的只是显示存在
  • 当我们有复合索引时,是否需要普通的MySql索引

    我们的 MySql 表有 2500 万行 以下是表中的列 c id c name s id l type l time message domain 其中 我们在 c id c name s id l type domain 列上有正常索引
  • 暴露 net.tcp 端点

    我对如何在 WCF 中公开端点有点困惑 我有一个 tcp 端点和一个 mex tcp 端点
  • 如何使用 jQuery 在页面加载时关注表单输入文本字段?

    这可能非常简单 但是有人可以告诉我如何在页面加载时让光标在文本框上闪烁吗 将焦点设置在第一个文本字段上 input text visible first focus 这也执行第一个文本字段 但您可以将 0 更改为另一个索引 input ty
  • 无法运行 H2o 功能

    我能够很好地安装 h2o 在 R 中 但是当我运行 h2o init 时出现以下错误 h2o init H2O 尚未运行 现在开始 值错误 3L 您有 32 位版本的 Java H2O 在 64 位 Java 上运行效果最佳 请从以下网址下
  • 使用 BS4“lxml”抓取 XML 数据

    尝试解决与此非常相似的问题 使用 beautifulsoup 抓取 XML 元素属性 https stackoverflow com questions 37968565 scraping xml element attributes wi
  • AngularJS Masonry 用于动态改变高度

    我有点击时会展开和收缩的 div Masonry 库对于初始化页面非常有效 我遇到的问题是 通过 Masonry 和下面的指令进行绝对定位 当 div 展开时 它们会与下面的 div 重叠 我需要将扩展 div 下面的 div 向下移动以处