angularjs自定义ng-model标签的属性


Posted in Javascript onJanuary 21, 2016

有的时候我们需要为非input类型的元素添加ng-model来实现双向的数据绑定,从而减少冗余代码,那么可以尝试一下的方式

例如:我页面中使用了contenteditable这个属性来实现用户可直接编译的div元素

html:

<style>
    .text{
      margin:0 auto;
      width:100px;
      height:50px;
      border:1px solid red;
    }
  </style>
</head>
<body>
<div ng-controller="selectController">
  <div ng-repeat="pop in citylist">
    <div class="text" contenteditable="true" ng-model="pop.pop"></div>
  </div>
  <button ng-click="cs()">输出新数据</button>
</div>
</body>

但是直接绑定ng-model是肯定得不到数据的,这时就需要为其增加自定义的属性,如下所示。

js:

<script>
  var app = angular.module('app', []);
  app.controller('selectController', function ($scope) {
    $scope.citylist=[{id:1,pop:"北京"},{id:1,pop:"上海"},{id:1,pop:"广州"}];
    $scope.p={};
    $scope.cs=function(){
      console.log($scope.citylist);
    }
  }).directive('contenteditable', function() {//自定义ngModel的属性可以用在div等其他元素中
    return {
      restrict: 'A', // 作为属性使用
      require: '?ngModel', // 此指令所代替的函数
      link: function(scope, element, attrs, ngModel) {
        if (!ngModel) {
          return;
        } // do nothing if no ng-model
        // Specify how UI should be updated
        ngModel.$render = function() {
          element.html(ngModel.$viewValue || '');
        };
        // Listen for change events to enable binding
        element.on('blur keyup change', function() {
          scope.$apply(readViewText);
        });
        // No need to initialize, AngularJS will initialize the text based on ng-model attribute
        // Write data to the model
        function readViewText() {
          var html = element.html();
          // When we clear the content editable the browser leaves a <br> behind
          // If strip-br attribute is provided then we strip this out
          if (attrs.stripBr && html === '<br>') {
            html = '';
          }
          ngModel.$setViewValue(html);
        }
      }
    };
  })
</script>

其中参数类别如下:

angularjs自定义ng-model标签的属性

部分参数解释

restrict:

(字符串)可选参数,指明指令在DOM里面以什么形式被声明;

取值有:E(元素),A(属性),C(类),M(注释),其中默认值为A;

E(元素):<directiveName></directiveName>
A(属性):<div directiveName='expression'></div>
C(类):   <div class='directiveName'></div>
M(注释):<--directive:directiveName expression-->

2.require

字符串代表另一个指令的名字,它将会作为link函数的第四个参数

具体用法我们可以举个例子说明

假设现在我们要编写两个指令,两个指令中的link链接函数中(link函数后面会讲)存在有很多重合的方法,

这时候我们就可以将这些重复的方法写在第三个指令的controller中(上面也讲到controller经常用来提供指令间的复用行为)

然后在这两个指令中,require这个拥有controller字段的的指令(第三个指令),

最后通过link链接函数的第四个参数就可以引用这些重合的方法了。

<!doctype html>
<html ng-app="myApp">
<head>
 <script src="http://cdn.staticfile.org/angular.js/1.2.10/angular.min.js"></script>
</head>
<body>
 <outer-directive>
   <inner-directive></inner-directive>
   <inner-directive2></inner-directive2>
 </outer-directive>
 <script>
  var app = angular.module('myApp', []);
  app.directive('outerDirective', function() {
     return {
        scope: {},
        restrict: 'AE',
        controller: function($scope) {   
         this.say = function(someDirective) { 
           console.log('Got:' + someDirective.message);
         };
        }
      };
  });
  app.directive('innerDirective', function() {
     return {
        scope: {},
        restrict: 'AE',
        require: '^outerDirective',
        link: function(scope, elem, attrs, controllerInstance) {
            scope.message = "Hi,leifeng";
            controllerInstance.say(scope);
        }
     };
  });
  app.directive('innerDirective2', function() {
     return {
        scope: {},
        restrict: 'AE',
        require: '^outerDirective',
        link: function(scope, elem, attrs, controllerInstance) {
            scope.message = "Hi,shushu";
            controllerInstance.say(scope);
        }
     };
  });
 </script>
</body>
</html>

上面例子中的指令innerDirective和指令innerDirective2复用了定义在指令outerDirective的controller中的方法

也进一步说明了,指令中的controller是用来让不同指令间通信用的。

另外我们可以在require的参数值加上下面的某个前缀,这会改变查找控制器的行为:

(1)没有前缀,指令会在自身提供的控制器中进行查找,如果找不到任何控制器,则会抛出一个error

(2)?如果在当前的指令没有找到所需的控制器,则会将null传给link连接函数的第四个参数

(3)^如果在当前的指令没有找到所需的控制器,则会查找父元素的控制器

(4)?^组合

Javascript 相关文章推荐
基于jquery的页面划词搜索JS
Sep 14 Javascript
js 弹出框 替代浏览器的弹出框
Oct 29 Javascript
使用JS 清空File控件的路径值
Jul 08 Javascript
解决Jquery鼠标经过不停滑动的问题
Mar 03 Javascript
jquery实现定时自动轮播特效
Dec 10 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
原生js实现jquery函数animate()动画效果的简单实例
Aug 21 Javascript
vue如何将v-for中的表格导出来
May 07 Javascript
微信小程序自定义tab实现多层tab嵌套功能
Jun 15 Javascript
node.js使用express框架进行文件上传详解
Mar 03 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
Jul 04 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
Jan 21 #Javascript
js实现的二分查找算法实例
Jan 21 #Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
Jan 21 #Javascript
angularjs表格分页功能详解
Jan 21 #Javascript
使用angularjs创建简单表格
Jan 21 #Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 #Javascript
Javascript中神奇的this
Jan 20 #Javascript
You might like
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
初识Laravel
2014/10/30 PHP
php统计数组元素个数的方法
2015/07/02 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
python线程池threadpool使用篇
2018/04/27 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
python IDLE添加行号显示教程
2020/04/25 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
护士自我鉴定总结
2014/03/24 职场文书
中国入世承诺
2014/04/01 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
小学生思想品德评语
2014/12/31 职场文书
通知范文怎么写
2015/04/16 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书