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 相关文章推荐
JQuery中each()的使用方法说明
Aug 19 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
JavaScript事件委托实例分析
May 26 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
JavaScript如何获取数组最大值和最小值
Nov 18 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
Vue.js 十五分钟入门图文教程
Sep 12 Javascript
vue实现搜索功能
May 28 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
Jan 20 Javascript
如何利用React实现图片识别App
Feb 18 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将数据导入到Foxmail
2006/10/09 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
js实现计算器功能
2020/08/10 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
Python json转字典字符方法实例解析
2020/04/13 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
中学老师的自我评价
2013/11/07 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
气象学专业个人求职信
2014/04/22 职场文书
我的长生果教学反思
2014/04/28 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
大跃进口号
2014/06/16 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
交通事故起诉书
2015/05/19 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript