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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
又一个图片自动缩小的JS代码
Mar 10 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
AngularJS数据源的多种获取方式汇总
Feb 02 Javascript
JavaScript注入漏洞的原理及防范(详解)
Dec 04 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
Dec 06 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
图文介绍Vue父组件向子组件传值
Feb 17 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
Oct 26 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
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
利用python实现数据分析
2017/01/11 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
工程采购员岗位职责
2014/03/09 职场文书
干部对照检查材料范文
2014/08/26 职场文书
绿色环保倡议书
2015/04/28 职场文书
大学学生会辞职信
2015/05/13 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python