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


Posted in Javascript onSeptember 21, 2016

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

下面有几个点:

1、$formatters中push进去的函数实现modelValue转成valeuValue。
2、$render方法实现把viewValue中的值渲染到模板中。
3、$setViewValue实现的是更新模板中的viewValue值。
4、$parsers中push进去的方法实现valueValue转成modelValue。

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

<!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;
    -webkit-transform: rotateX(120deg);
    -moz-transform: rotateX(120deg);
    -ms-transform: rotateX(120deg);
    -o-transform: rotateX(120deg);
    transform: rotateX(20deg);
  }
  .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>

以上就是对AngularngModel实现指令与输入直接的数据通信的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScrip单线程引擎工作原理分析
Sep 04 Javascript
js常用代码段收集
Oct 28 Javascript
往光标所在位置插入值的js代码
Sep 22 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
Javascript字符串对象的常用方法简明版
Jun 26 Javascript
jquery实现多行文字图片滚动效果示例代码
Oct 10 Javascript
javascript中的深复制详解及实例分析
Dec 29 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
Jan 03 Javascript
JS返回顶部实例代码
Aug 09 Javascript
vue2.0结合Element-ui实战案例
Mar 06 Javascript
详解JavaScript栈内存与堆内存
Apr 04 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
Jul 28 Javascript
D3.js实现折线图的方法详解
Sep 21 #Javascript
利用BootStrap弹出二级对话框的简单实现方法
Sep 21 #Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 #Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
Sep 21 #Javascript
D3.js实现柱状图的方法详解
Sep 21 #Javascript
AngularJS ng-style中使用filter
Sep 21 #Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
Sep 21 #Javascript
You might like
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
Python下简易的单例模式详解
2019/04/08 Python
实例详解Python模块decimal
2019/06/26 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
天网工程实施方案
2014/03/26 职场文书
幼师求职信
2014/06/23 职场文书
设备收款委托书范本
2014/10/02 职场文书
学校实习推荐信
2015/03/27 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python