首先来看一下效果,在拖动input[range]的时候,下面的动画会随着拖动而发生改变,利用的原理就是ngModel实现的通信。实现的原理就是通过在指令中引入^ngModel来实现指令内部与外部之间的通信。
下面有几个点:
1、$formatters中push进去的函数实现modelValue转成valeuValue。 2、$render方法实现把viewValue中的值渲染到模板中。 3、$setViewValue实现的是更新模板中的viewValue值。 4、$parsers中push进去的方法实现valueValue转成modelValue。
<Meta charset="UTF-8">
<animate-span ng-model="rangeModel">
@H_502_22@
var app=angular.module("rangeApp",[])
.controller("rangeCon",["$scope",function ($scope) {
$scope.rangeModel=30;
}])
.directive("animateSpan",function () {
return{
restrict:'EA',replace:true,scope:{},require:'^ngModel',template:'
',link: function (scope,element,attr,ngModelController) {
var rotateX= function (modelValue) {
var modelValue=parseInt(modelValue)||0;
var value="rotateX("+modelValue*3+"deg)";
return {
dis:value
};
};
var rotateY= function (modelValue) {
var modelValue=parseInt(modelValue)||0;
var value="rotateY("+modelValue*3+"deg)"
return {
dis:value
}
};
var rotateZ= function (modelValue) {
var modelValue=parseInt(modelValue)||0;
var value="rotateZ("+modelValue*3+"deg)";
return {
dis:value
}
};
//scope.dis=30;
ngModelController.$formatters.push(rotateZ);//modelValue到viewValeu之间的通信。
ngModelController.$render= function () {//把viewmodel渲染到模板中
scope.dis=ngModelController.$viewValue.dis;
$(element).find("span").css("-webkit-transform",scope.dis)
};
scope.$watch('dis',function () {//更新模板上的viewValue
ngModelController.$setViewValue({
dis:scope.dis
})
})
}
}
})