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 相关文章推荐
jQuery移动和复制dom节点实用DOM操作案例
Dec 17 Javascript
原生JavaScript实现连连看游戏(附源码)
Nov 05 Javascript
基于jQuery实现的文字按钮表单特效整理
Dec 07 Javascript
node.js中的fs.fsyncSync方法使用说明
Dec 15 Javascript
封装好的js判断操作系统与浏览器代码分享
Jan 09 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
Aug 08 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
微信小程序实现电子签名功能
Jul 29 Javascript
vue实现简单全选和反选功能
Sep 15 Javascript
echarts实现晶体球面投影的实例教程
Oct 10 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 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python日期时间Time模块实例详解
2019/04/15 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Python中turtle库的使用实例
2019/09/09 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Python发送邮件实现基础解析
2020/08/14 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
内科护士实习自我鉴定
2013/10/17 职场文书
领导证婚人证婚词
2014/01/13 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
教师业务学习材料
2014/12/16 职场文书
乱世佳人观后感
2015/06/08 职场文书
学会感恩主题班会
2015/08/12 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
golang语言指针操作
2022/04/14 Golang