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 相关文章推荐
JavaScript更改class和id的方法
Oct 10 Javascript
JavaScript初学者应注意的七个细节详细介绍
Dec 27 Javascript
JavaScript中伪协议 javascript:使用探讨
Jul 18 Javascript
JavaScript 节流函数 Throttle 详解
Jul 04 Javascript
ECMAScript6 新特性范例大全
Mar 24 Javascript
基于Vuejs的搜索匹配功能实现方法
Mar 03 Javascript
AngularJs分页插件使用详解
Jun 30 Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 Javascript
vue+koa2搭建mock数据环境的详细教程
May 18 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
Jul 17 Javascript
vue-video-player 断点续播的实现
Feb 01 Vue.js
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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
php防止sql注入的方法详解
2017/02/20 PHP
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
基于python实现学生管理系统
2018/10/17 Python
python使用配置文件过程详解
2019/12/28 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
Etam德国:内衣精品店
2019/08/25 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
问卷调查计划书
2014/01/10 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
优秀经理获奖感言
2014/03/04 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
Golang 编译成DLL文件的操作
2021/05/06 Golang
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
php将xml转化对象的实例详解
2021/11/17 PHP