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 学习技巧
Feb 17 Javascript
非常好用的JsonToString 方法 简单实例
Jul 18 Javascript
jquery的选择器的使用技巧之如何选择input框
Sep 22 Javascript
标题过长使用javascript按字节截取字符串
Apr 24 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
使用Chart.js图表库制作漂亮的响应式表单
Oct 28 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
Dec 10 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
Mar 16 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
Jun 27 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 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数组中的重复值的实现代码
2011/07/17 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
python 图片验证码代码
2008/12/07 Python
Python修改MP3文件的方法
2015/06/15 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python模拟登陆实现代码
2017/06/14 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
村干部承诺书
2014/03/28 职场文书
普通党员整改措施
2014/10/24 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
车辆管理制度范本
2015/08/05 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
表扬信范文
2019/04/22 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL