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实现简单易懂的图片展示小例子
Nov 21 Javascript
jquery动态加载select下拉框示例代码
Dec 10 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 Javascript
js函数调用的方式
May 06 Javascript
浅谈 javascript 事件处理
Jan 04 Javascript
JavaScript实现自动变换表格边框颜色
May 08 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
Mar 09 Javascript
D3.js实现拓扑图的示例代码
Jun 30 Javascript
在layui tab控件中载入外部html页面的方法
Sep 04 Javascript
javascript数组的定义及操作实例
Nov 10 Javascript
微信小程序用户授权最佳实践指南
May 08 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-fpm 参数的深入理解
2013/06/03 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
Vue 组件间的样式冲突污染
2017/08/31 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
Python入门篇之正则表达式
2014/10/20 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
HTML5标签大全
2016/11/23 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
给酒店员工的表扬信
2014/01/11 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
高中教师个人总结
2015/02/10 职场文书
七年级思品教学反思
2016/02/20 职场文书
Go语言编译原理之源码调试
2022/08/05 Golang