【问题标题】:AngularJS Animations ng-switch ng-repeatAngularJS 动画 ng-switch ng-repeat
【发布时间】:2013-11-29 20:27:32
【问题描述】:

我正在尝试做一个看起来很简单的过程:显示从带有动画的 HTTP 请求接收到的项目列表。

首先,这是我的做法(我愿意接受任何建议以更好的角度来做):

  • 我定义了一个作用域变量state,我在控制器中将其初始化为loading,并在我从HTTP 请求接收数据时更改为loaded
  • 我用接收到的数据初始化了一个作用域变量items
  • 在我看来,我将ng-switch 用于状态,ng-repeat 用于项目。
  • 我在 ng-repeat 上定义了一个带有 css 的动画。

这里是a plunkr(使用 $timeout 而不是请求)。

我不明白为什么动画不起作用。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: angularjs animation ng-repeat ng-switch


    【解决方案1】:

    它发生的原因是因为你的ng-whenng-if 也会发生同样的事情,但如果您使用 ng-show 会正常工作。

    问题在于,当您的 ng-when 条件返回 true 时,ng-when 首先将其内容呈现在分离的 dom 中(因此不会发生动画)。然后将此 dom 附加到 dom 树(此步骤是动画的,但您必须将动画类放在 ng-when 上)。

    当使用 ng-showng-hide 之类的东西时,事情会按预期工作,因为 dom 始终是附加的(它只是显示/隐藏)。

    这可能被认为是 ng-animate 的错误或限制,您可能想发布一个 github 问题,看看有角的家伙是否有任何想法。

    【讨论】:

    • 感谢您的回答。我也试过ng-show,然后发现它与dom有关,因为它正在使用这个指令,所以再次感谢你的清晰解释。正如我在对上一个答案的评论中所说,我的网站比我的示例更复杂。即使我可以使用 ng-hide / ng-show 让事情顺利进行,你认为我打算做的事情是最佳实践吗?
    • ng-show 通常会降低性能,因为即使内容被隐藏,该 dom 中的所有手表仍将在每个 $digest() 周期处理,但这可能非常好(如果您的页面只是显示加载....)无论如何都没有发生任何事情,因此在加载完成之前不会触发手表,此时您希望它们被触发。如果你隐藏了一堆不同的 dom 树并且一次只显示一个,那就更成问题了。那么你应该考虑更好的解决方案,比如路由。
    【解决方案2】:

    这似乎是 Angular 的一个“功能”,它不会添加 .ng-enter 来重复 ng-switch-when 块内的项目。你可以删除ng-switch-when="loaded",它会起作用(你并不需要它,因为如果没有项目,ng-repeat 不会做任何事情)

    <div ng-switch="state">
      <div ng-switch-when="loading">
        <p>Please wait...</p>
      </div>
      <div >
        <ul ng-repeat="item in items" class="animate-items">
          <li>{{item}}</li>
        </ul>
      </div>
    </div>
    

    http://plnkr.co/edit/ocEj7BSQPSeIdnnfAOIE?p=preview

    【讨论】:

    • 首先,感谢您的快速回答。我已经尝试过了,它适用于该示例。问题是我的网站更复杂,因为我的示例只是为了清楚起见。它不仅包含ng-repeat,还包含封装在ng-switch="loaded" 中的其他内容,并且在加载数据时无法显示它。
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2017-02-02
    相关资源
    最近更新 更多