在angularjs中删除动画中间的元素

Posted

技术标签:

【中文标题】在angularjs中删除动画中间的元素【英文标题】:Remove an element that is in the middle of an animation in angularjs 【发布时间】:2021-04-20 17:05:31 【问题描述】:

我有一个实例,其中我有 3 个可能的滚动动画,具体取决于模型。我正在使用ng-if 来处理删除与模型条件不匹配的元素。当模型发生变化时,我的问题就出现了。匹配条件的元素开始滚动动画,但在动画完成之前似乎留下了前一个。检查元素确实表明分别应用了ng-leaveng-enter

如何让不符合ng-if条件的旧动画立即隐藏?

查看

<div class='phrase' ng-if='status === "live"'>
    LIVE
</div>
<div class='phrase' ng-if='status === "pending"'>
    PENDING
</div>
<div class='phrase' ng-if='status === "finished"'>
    FINISHED
</div>

SCSS

.phrase 
text-align: center;
color: rgba(255,255,255, 0.7);
font-weight: bold;
position: absolute;
white-space: nowrap;
width: 100%;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
font-size: 12vw;
animation: slide 10s linear infinite;
animation-direction: reverse;

@keyframes slide 
  0% 
    transform:translate(-270%, -50%);
  
  100% 
    transform:translate(50%, -50%);
  

【问题讨论】:

你可以绑定状态而不是使用它来隐藏元素吗?即&lt;div class="phrase"&gt;status | uppercase&lt;/div&gt; 这可能是一个更好的选择。我稍后会在这里查看。 【参考方案1】:

好吧,当我完成它时,我采用了撕下创可贴方法并手动从 DOM 中删除了元素。

如果您找到解决 ng-animate 崩溃的方法,我很想听听其他答案。

// 在视图中

<div class='phrase' id='live' ng-if='status === "live"'>
    LIVE
</div>
<div class='phrase' id='pending' ng-if='status === "pending"'>
    PENDING
</div>
<div class='phrase' id='finished' ng-if='status === "finished"'>
    FINISHED
</div>

//在控制器中

// watched for condition, then remove element with id
if($scope.status === "live")
    angular.element(document.querySelector("#pending")).remove();

--- 编辑---

我使用了@Mark Clark 的建议并采取了更简单的方法。在视图中绑定状态一次是要走的路。在我的情况下,这很好用,但我仍然可以看到试图克服 ng-animate 覆盖 ng-if 对其他人来说可能是一个问题。这肯定是个例外情况。

最佳答案

<div class='phrase'>
    status
</div>

【讨论】:

这违反了核心 AngularJS 原则,即您永远从控制器修改 DOM。 我知道这是非常反模式的。直到我找到另一个解决方案,这就是我得到的。

以上是关于在angularjs中删除动画中间的元素的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS

AngularJS 动画

与 AngularJS 相比,在 Polymer 中创建自定义 HTML5 元素/小部件的优缺点是啥

AngularJS API

AngularJS动画在表格中交换行

AngularJS 1.2从0到0.5的淡入淡出动画不起作用