ngModel实现指令与输入直接的数据通信

作者: MakingChoice | 来源:发表于2016-04-16 08:41 被阅读167次

首先来看一下效果,在拖动input[range]的时候,下面的动画会随着拖动而发生改变,利用的原理就是ngModel实现的通信。实现的原理就是通过在指令中引入<code>^ngModel</code>来实现指令内部与外部之间的通信。<p>
下面有几个点:

1、$formatters中push进去的函数实现modelValue转成valeuValue。

2、$render方法实现把viewValue中的值渲染到模板中。

3、$setViewValue实现的是更新模板中的viewValue值。

4、$parsers中push进去的方法实现valueValue转成modelValue。

jdfw.gif
<!DOCTYPE html>
<html lang="en" ng-app="rangeApp">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<script src="lib/angular.min.js" type="text/javascript"></script>
<script src="lib/jquery-2.1.4.min.js" type="text/javascript"></script>
<style>
    div{
        position: absolute;
    }
    .ani{
        width: 200px;
        height: 200px;
        border: 1px solid aqua;
        position: absolute;
        top: 100px;
        left: 200px;
    }
    .active{
        background: red;
    }
    ::-webkit-slider-runnable-track {
        border: 1px solid #a0b3d6;
        background: #f0f3f9;
    }
    ::-webkit-slider-thumb {
        outline: 1px dotted #a0b3d6;
        background-color: #34538b;
    }
    ::-webkit-slider-runnable-track:hover {
        background-color: #cad5eb;
    }


    ::-moz-range-track {
        border: 1px solid #a0b3d6;
        height: 20px;
        background: #f0f3f9;
    }
    ::-moz-range-thumb {
        background: #34538b;
        height: 30px;
    }

    ::-ms-fill-lower { background: orange; }
    ::-ms-fill-upper { background: green; }
    ::-ms-thumb { background: red; }
    ::-ms-ticks-before { display: block; color: black; }
    ::-ms-ticks-after { display: block; color: blue; }
    ::-ms-track { padding: 5px; }
    ::-ms-tooltip { display: none; /* 数值提示 只能是display或visibility */ }
</style>
<body ng-controller="rangeCon">
<input type="range" ng-model="rangeModel"/>

<animate-span ng-model="rangeModel"></animate-span>
</body>
<script>
    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:'<div><span class="ani" ng-model="dis">{{dis}}</span></div>',
                    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
                            })
                        })
                    }
                }
            })
</script>
</html>

相关文章

网友评论

    本文标题:ngModel实现指令与输入直接的数据通信

    本文链接:https://www.haomeiwen.com/subject/jjnnlttx.html