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 相关文章推荐
node.js入门教程
Jun 01 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
JavaScript+CSS相册特效实例代码
Sep 07 Javascript
JS简单实现数组去重的方法分析
Oct 14 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
Feb 08 Javascript
Angular ng-animate和ng-cookies用法详解
Apr 18 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
在vue中使用setInterval的方法示例
Apr 16 Javascript
vue实现五子棋游戏
May 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
PHP获得数组交集与差集的方法
2015/06/10 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
详解Python中的__new__()方法的使用
2015/04/09 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
彻底搞懂Python字符编码
2018/01/23 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
python定义具名元组实例操作
2021/02/28 Python
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
客户经理岗位职责
2013/12/08 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
调解协议书范本
2016/03/21 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python