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 相关文章推荐
用javascript控制iframe滚动的代码
Apr 10 Javascript
JavaScript写的一个自定义弹出式对话框代码
Jan 17 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
Oct 11 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
Jquery技巧(必须掌握)
Mar 16 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
Jul 07 Javascript
BootStrap轮播HTML代码(推荐)
Dec 10 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
Jun 13 Javascript
JS删除String里某个字符的方法
Jan 06 Javascript
jQuery HTML设置内容和属性操作实例分析
May 20 jQuery
Vue自动构建发布脚本的方法示例
Jul 24 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python模块future用法原理详解
2020/01/20 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
学习Python列表的基础知识汇总
2020/03/10 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
物流管理专业毕业生求职信
2014/03/23 职场文书
售后服务承诺书
2014/03/26 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
MySQL的存储过程和相关函数
2022/04/26 MySQL
nginx之queue的具体使用
2022/06/28 Servers
MySQL数据管理操作示例讲解
2022/12/24 MySQL