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 相关文章推荐
学习YUI.Ext 第七天--关于View&amp;JSONView
Mar 10 Javascript
javascript preload&amp;lazy load
May 13 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
javascript实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
Nov 07 Javascript
浅谈Javascript 数组与字典
Jan 29 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
May 31 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
May 25 Javascript
详解Vue中一种简易路由传参办法
Sep 15 Javascript
javascript动态创建对象的属性详解
Nov 07 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中对缓冲区的控制实现代码
2013/09/29 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php中define用法实例
2015/07/30 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
PHP强制转化的形式整理
2020/05/22 PHP
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
详解Python的Django框架中的templates设置
2015/05/11 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
简单了解django文件下载方式
2020/02/10 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
《学会合作》教学反思
2014/04/12 职场文书
倡议书格式
2014/04/14 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
慰问信模板
2015/02/14 职场文书
运动会开幕式主持词
2015/07/01 职场文书
初中军训感想
2015/08/07 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
话题作文之诚信
2019/11/28 职场文书
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
详解Python中的for循环
2022/04/30 Python
vue中data里面的数据相互使用方式
2022/06/05 Vue.js