我使用ng-repeat指令生成了一些<rect>
s,<animate>
孩子。SVG ng-repeat'ed元素上的SMIL動畫僅在頁面加載時發生
在頁面加載時,動畫被正確觸發,所有事情都按預期發生。 但是,當我添加新的<rect>
時,動畫不會發生。
以下代碼段演示了此行爲:
function Controller($scope) {
$scope.rects = [];
var spacing = 5;
var width = 10;
var height = 100;
var x = 10;
var y = 10;
$scope.newRect = function() {
$scope.rects.push({
x: x,
y: y,
width: width,
height: height
});
x += spacing + width;
};
for (var i = 0; i < 5; i++) {
$scope.newRect();
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="Controller">
<svg width="1000" height="200">
<rect ng-repeat="rect in rects" x="{{rect.x}}" y="{{rect.y}}" height="{{rect.height}}" width="{{rect.width}}">
<animate attributeName="y" from="{{rect.height}}" to="{{rect.y}}" dur="1s" repeatCount="1" />
<animate attributeName="height" from="0" to="{{rect.height}}" dur="1s" repeatCount="1" />
</rect>
</svg>
<button ng-click="newRect()">One more</button>
</div>
在加載的例子中,4 <rect>
會出現,從底部到頂部動畫。但是,當按下「One more」按鈕時,將添加新的<rect>
而不顯示動畫(在Firefox 35和Chrome 38上測試的行爲)。
如何觸發新的<rect>
s的動畫?
我嘗試了'beginElement()'方法。然而,因爲我在觸發它之前需要Javascript訪問''元素,所以我需要在'setTimeout(fn,0)'中包裝這個調用。在某些情況下,這會產生一個閃爍,用戶可以在動畫觸發前看到完整的''(現在我想寫一個段落並且無意中提交了答覆,經驗教訓!)。不過,我會試着看看我能不能用(a)方法做出一些事情,謝謝。 –
Daniel
2014-10-29 10:15:19
@Daniel如果你還沒有弄清楚自己,請參閱編輯。 – AmeliaBR 2014-10-29 15:41:44
我的確嘗試過這個解決方案,但不知不覺地寫了'this.DOMNodeInserted'而不是'DOMNodeInserted'。感謝您的編輯,這非常有幫助。至於其他的一點:10px的偏移確實是無意的,我在我的代碼中糾正了它,但認爲它對於手頭的問題不夠重要。關於第二點:不,在此關頭,較老的IE並不是問題,幸運的是。 – Daniel 2014-10-29 18:10:24