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中的数学函数集合
May 08 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
Feb 03 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
jQuery实用技巧必备(上)
Nov 02 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
Vue.js实现的购物车功能详解
Jan 27 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
Apr 25 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 Javascript
Java 生成随机字符的示例代码
Jan 13 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
详解python时间模块中的datetime模块
2016/01/13 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
青春寄语大全
2014/04/09 职场文书
银行进社区活动总结
2014/07/07 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
2016年校长新年寄语
2015/08/17 职场文书
Python基础之进程详解
2021/05/21 Python
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
Python Matplotlib绘制动画的代码详解
2022/05/30 Python