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 相关文章推荐
对字符串进行HTML编码和解码的JavaScript函数
Feb 01 Javascript
ExtJs中gridpanel分组后组名排序实例代码
Dec 02 Javascript
jquery+html5烂漫爱心表白动画代码分享
Aug 24 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
Oct 09 Javascript
JavaScript数据类型学习笔记
Jan 25 Javascript
jQuery stop()用法实例详解
Jul 28 Javascript
JS实现列表的响应式排版(推荐)
Sep 01 Javascript
vuejs如何配置less
Apr 25 Javascript
js实现简单选项卡功能
Mar 23 Javascript
JS 封装父页面子页面交互接口的实例代码
Jun 25 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 Javascript
jQuery实现评论模块
Aug 19 jQuery
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
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
Python最基本的输入输出详解
2015/04/25 Python
常见python正则用法的简单实例
2016/06/21 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
详解python中init方法和随机数方法
2019/03/13 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
什么是规则表达式
2012/05/03 面试题
资深地理教师自我评价
2013/09/21 职场文书
电子商务专员岗位职责
2013/12/11 职场文书
司机辞职报告范文
2014/01/20 职场文书
美容院营销方案
2014/03/05 职场文书
房产委托公证书样本
2014/04/04 职场文书
python中的sys模块和os模块
2022/03/20 Python