如何相对于导致更改的点击事件对 ng-repeat 项目进行动画处理

2024-03-08

我正在尝试让用户从不同的项目集中选择项目。 该项目应从单击的设置动画到所选项目列表中的新位置。

在下面的演示中,将粉色框视为可用项目,将边框框视为所选项目列表(蓝色框)。用户可以通过单击任一粉红色框来选择项目:

angular.module('test', ['ngAnimate'])
  .controller('testCtrl', function($scope) {
    $scope.products = [{}, {}, {}, {}];
    $scope.purchased = [{}];
    $scope.purchase = function(dir) {
      $scope.direction = dir
      $scope.purchased.push($scope.products.pop());
    };
  })
  .directive('testDir', function($animate) {
    return {
      link: function(scope, element) {
        $animate.on('enter', element, function(element, phase) {
          $target = scope.direction == 'left' ? $('.stock:first') : $('.stock:last');
          element.position({
            my: 'center',
            at: 'center',
            of: $target,
            using: function(pos, data) {
              $(this).css(pos);
              $(this).animate({
                top: 0,
                left: 0
              });
            }
          });
        });
      }
    };
  });
.stock {
  display: inline-block;
  width: 50px;
  height: 50px;
  background: hotpink;
}
.stock.right {
  margin-left: 100px;
}
.product {
  height: 50px;
  width: 50px;
  border: 1px solid;
}
.purchased {
  height: 60px;
  margin-top: 100px;
  border: 2px dotted;
}
.purchased .product {
  display: inline-block;
  margin: 5px;
  background: dodgerblue;
}
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular.js"></script>
<script src="https://code.angularjs.org/1.4.8/angular-animate.js"></script>
<div ng-app="test" ng-controller="testCtrl">
  <div class="stock" ng-click="purchase('left')"></div>
  <div class="stock right" ng-click="purchase('right')"></div>
  <div class="purchased clearfix">
    <div class="product" ng-repeat="product in purchased" data-test-dir>
    </div>
  </div>
</div>

好吧,它有点有效 - 但我使用 jQuery-ui 来找出起始位置(粉红色框的位置在响应式设计中会很谨慎)并使用 jquery animate 方法来为元素设置动画。

另外,我必须将单击的方向存储在范围中,并且我正在设置初始位置和动画到结束位置enter事件监听器。

我一直在阅读和尝试很多内置的角度动画钩子,但无法找出从相对/动态位置对元素进行动画处理的正确方法。

有没有更好的方法以 Angular JS 方式实现相同的用户体验..?


如果我正确理解了你的问题(如果没有,请告诉我);我认为解决这个问题的一种方法是这样的:

假设您的产品的尺寸(宽度)恒定 - 设置为 50px 或其他 - ;您可以将粉红色元素的位置设置为绝对;然后对粉红色元素使用 ng-repeat,并在 html 中添加一个简短的 ng-style 属性,如下所示:

<div ng-repeat="item in products" ng-style="{'left': $index*50 + 'px'}" ng-click="add-to-purchased($index)"></div>

关于购买的产品:不要在“购买”数组上使用 ng-repeat,而是在“add-to-purchased”函数内,将产品推送到“购买”数组后,您可以简单地将产品动画到“顶部” : '到边框元素的高度距离'" 和 "left" 等于 {$scope.purchased.length*50 + 'px'}。然后使用 ng-class (带有切换开关)添加一个类来进行着色和其他 css 内容...(您也可以考虑颜色变化的过渡。正如您可能知道的那样)

我还认为您可以使用 ng 类处理不同的高度和顶部问题(以防产品数量超过一行的容量),该类根据以下内容添加具有新“顶部”值的类: ($index > some- number),以及上部元素的另一个 ng-class(位于有边框元素顶部的元素),改变它的高度......

我希望这可以帮到你


Update:

不幸的是我没有很好地理解这个问题。但现在看看这个问题,我认为有一种方法可以更动态地做到这一点。

在 - 的里面$scope.purchase函数,你可以用以下方式发送你的指令$broadcast并像这样传递单击的元素(对于库存中的任何元素,无论是否使用 ng-repeat 创建):

<div class="stock" ng-click="purchase($event)"></div>

and:

$scope.purchase = function(event) {
  $scope.purchased.push($scope.products.pop());
  $scope.$broadcast('purchaseHappened', event.target);
};

并在您的指令中放置事件侦听器:

scope.$on('purchaseHappened', function(event, target) {
     //catch target in here, and then use it's position to animate the new elements...
})

我想你也可以使用target.getBoundingClientRect()获取元素相对于视口的位置(.top , .left,...) 而不是 jquery-ui 的.position如果你想...

是否更接近解决方案?

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

如何相对于导致更改的点击事件对 ng-repeat 项目进行动画处理 的相关文章

  • navigator.platform 在 ARM Mac 上的价值是什么?

    苹果有released https www apple com apple events november 2020 几款基于采用 ARM 架构的 M1 芯片的新计算机 与之前基于 x86 架构的计算机相比 的价值是多少navigator
  • 是否可以从“GET”请求中检索 MS/延迟? (Javascript/Jquery)

    我目前正在使用 jquery 发出一些 getjson 请求 他们是获取请求 GET http localhost MySite JSON http localhost MySite JSON 现在您可以在 Firebug 中观看请求的触发
  • JSONP 回调失败,需要 javascript/jquery 帮助

    我是 json 的菜鸟 了解一点 jquery 并尝试让一个小脚本工作 我想检索某个纬度 经度的时间 并根据我在网上阅读的内容编写了这个脚本 getJSON http ws geonames org timezoneJSON lat 47
  • 如何防止缓慢脚本警告并强制浏览器继续运行脚本直到完成?

    更新 2013 年 7 月 5 日 自从我最初问这个问题以来 我学到了很多东西 在下面的一条评论中 有人建议我重新处理该任务 并找到一种方法来解决它 而不会有阻塞 UI 的风险 我说不可能 函数必须按原样运行 我实际上不记得我试图用这个函数
  • ajax 页面上的超大插件

    我需要在我的 ajax 页面上使用超大插件 但我认为超大型没有任何破坏功能 当我调用下面的函数时 如何再次设置超大尺寸 解决方案 if supersized vars slideshow interval clearInterval sup
  • ajax 和相对 url

    我真的不明白这个 我有以下 获取 请求 ajax url api getdirectories dataType json success function data Do stuff 这是我的临时服务器向我提供的页面 http atlas
  • 调整发散堆积条形图以使用通用更新模式

    我一直在使用可用的堆积条形图示例here https bl ocks org mbostock b5935342c6d21928111928401e2c8608使用以下代码 var data month Q1 2016 apples 384
  • chrome 中的 Flexbox flex-flow 列换行错误?

    当使用列换行作为弹性流时 它似乎会对 chrome 中的容器尺寸造成问题 HTML 示例 div class root div class outer div class inner A div div class inner B div
  • 如何在 ES6 类中使用静态变量?

    我正在尝试在 es6 中使用静态变量 我想声明一个静态变量count in Animal类并增加它 但是 我无法通过声明静态变量static count 0 所以我尝试了另一种方法 class Animal constructor this
  • 如何检查 URL 末尾是否有特定字符串

    我需要根据 URL 末尾的内容让覆盖层向下滑动 如果 URL 末尾有 faq 覆盖层下降 如何在 jQuery JavaScript 中做到这一点 如果您的网址看起来像这样http yourdomain com faq 你可以这样做 var
  • 为什么 `BehaviorSubject` 不发出最后一个值

    The 关于BehaviorSubject的文档 http reactivex io documentation subject html声明它应该返回最后发出的值 无论我何时订阅 但它不会为我返回它 const ofObservable
  • 已安装 cypress npm 软件包,但缺少 Cypress 二进制文件

    大家好 我是 azure devops CI 的新手 我正在尝试通过在作业之间缓存 node modules 来减少管道构建时间 但我遇到了无法解决的错误 我正在使用 cypress 进行测试 这是我的天蓝色管道 Node js Build
  • 使用 CSS 内容添加 HTML 实体

    你如何使用CSS content要添加的属性HTML实体 使用这样的东西只是打印 nbsp 到屏幕而不是不间断空格 breadcrumbs a before content nbsp 您必须使用转义的 unicode Like breadc
  • Ruby 数组到 Javascript 数组

    我有一个带有帐户 ID 的 Ruby 数组 我想将帐户 ID 的 Ruby 数组存储在 Javascript 数组中 我想知道最好的方法是什么 另外 当我尝试执行此操作时 Javascript 似乎认为如果只输入一个帐户 ID 则该 ID
  • 取消子项上的 ng-swipe-right

    在我的角度应用程序中 主体有一个ng swipe向右和向左切换侧边栏 问题是当我的页面中有一个可滚动的水平 DIV 时 它不会因为身体的滑动而滚动 div class scrollable x long content that overf
  • jquery .slideToggle() 水平替代方案?

    SlideToggle 正是我想要的 只是我希望幻灯片是水平的 我现在有一个水平隐藏 显示和点击动画 但我想要切换选项 这样 当我单击活动链接时 它将播放反向动画并隐藏自身 最好的方法是什么 您可以使用animate方法 element a
  • 将 jQuery 与 Batman.js 结合使用

    我正在尝试使用 Batman js 并且我想将 jQuery 与它一起使用来实现一些标准的 Ajax 和动画功能 我正在按照位于的安装说明进行操作http batmanjs org download html http batmanjs o
  • 如何在 Mongo 聚合管道的 $unwind 阶段保留零长度值?

    我正在使用聚合管道编写 Mongo 查询 在聚合过程中 我需要 unwind领域之一 但是 我不想要 unwind排除该字段具有零长度数组的条目 因为我仍然需要它们进一步深入管道 我的领域叫做items它是一个对象数组 每个对象包含两个值
  • 是否可以通过样式表进行跨域攻击?

    我需要为我的 Web 应用程序的用户创建的网页实现灵活的样式系统 理想情况下 我希望允许他们使用 CSS 正在链接到用户定义的 url 处的样式表Bad Idea Why 可以安全地做到这一点吗 您对此有何看法 我试图避免构建样式 编辑器
  • jQuery 存储类型未定义

    我用了一个jQuery 存储 https ui5 sap com api jQuery sap storage存储数据 oStore jQuery sap storage jQuery sap storage Type local oSto

随机推荐