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 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
ASP Json Parser修正版
Dec 06 Javascript
不要在cookie中使用特殊字符的原因分析
Jul 13 Javascript
javascript对数组的常用操作代码 数组方法总汇
Jan 27 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
Jan 24 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 Javascript
JavaScript Ajax实现异步通信
Dec 14 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
从源码看angular/material2 中 dialog模块的实现方法
Oct 18 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 Javascript
JS实现扫雷项目总结
May 19 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
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
Ratchet 模态框的实现
2020/08/19 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
行政专员岗位职责
2014/01/02 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
优秀党员主要事迹
2014/01/19 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
小学校本培训方案
2014/06/06 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
PyMongo 查询数据的实现
2021/06/28 Python
golang内置函数len的小技巧
2021/07/25 Golang
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
springboot layui hutool Excel导入的实现
2022/03/31 Java/Android