我試圖編寫一個動畫指令,它改變了元素的寬度並在模型後綴中進行了更改。這裏是我的代碼:角動畫指令應該在動畫完成後調用控制器函數
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<div ng-app="myApp" ng-controller="MyCtrl">
<button ng-init="speed=20000" ng-click="model.width = model.width + 100;"> + </button>
<button ng-click="model.width = model.width - 100;"> - </button>
<div animate-to-width="model.width" speed="{{speed}}" done="model.done()" style="background-color: #f00; width: 100px;">w:{{model.width}}|a:{{model.a}}|b:{{model.b}}</div>
</div>
<script src="components/jquery/jquery.js"></script>
<script src="components/angular-unstable/angular.js"></script>
<script>
var myApp = angular.module('myApp',[]);
myApp.directive('animateToWidth', function() {
return {
'restrict': 'A',
'link' : {
'post': function(scope, element, attrs) {
scope.$watch(
attrs.animateToWidth,
function (newValue) {
element.animate(
{'width': newValue + 'px'},
attrs.speed,
function() {
scope.model.a++;
//scope[attrs.done]();
}
);
}
);
}
}
};
});
function MyCtrl($scope) {
$scope.model = {};
$scope.model.width = 100;
$scope.model.a = 0;
$scope.model.b = 0;
$scope.model.done = function() { $scope.model.b++; };
}
</script>
</body>
</html>
當我運行這段代碼jQuery的.animate()函數似乎並沒有影響到動畫的速度和回調(第三個參數)的第二個參數將在動畫後立即改爲調用已完成。
我的第二個問題是,我想從控制器傳遞迴調到指令,我不知道如何實現這一點。
編輯
這裏是解決方案(感謝@banana-in-black):
http://plnkr.co/edit/D9TJHBYjtnxTve0xZpBS?p=preview
在這裏,而不在控制器的寬度值:
http://plnkr.co/edit/eiy99Crh57Jc78RhAsRt?p=preview
謝謝!使速度成爲一個整數解決了兩個問題:'速度'被忽略,回調被立即調用(不是在動畫完成後)。我知道'$ apply',謝謝。我的問題在於,回調已經立即**執行**並且'a'已經增加,儘管它沒有被設置爲'$ apply'。我不想在指令中硬編碼控制器函數調用,因爲我不想讓指令知道有關控制器的任何信息。但我解決了回調問題:http://plnkr.co/edit/D9TJHBYjtnxTve0xZpBS?p=preview – stofl