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 相关文章推荐
document.getElementById的简写方式(获取id对象的简略写法)
Sep 10 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
Mar 04 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
基于JavaScript实现TAB标签效果
Jan 12 Javascript
Jquery attr()方法 属性赋值和属性获取详解
Apr 15 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
Jan 21 Javascript
微信小程序实现animation动画
Jan 26 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
浅谈vuepress 踩坑记
Apr 18 Javascript
Webpack按需加载打包chunk命名的方法
Sep 22 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 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之第八天
2006/10/09 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python如何设置静态变量
2020/09/07 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
亲戚结婚的请假条
2014/02/11 职场文书
干部现实表现材料
2014/02/13 职场文书
省文明单位申报材料
2014/05/08 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
好好学习保证书
2015/02/26 职场文书
民事辩护词范文
2015/05/21 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
python实现三次密码验证的示例
2021/04/29 Python
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python