依赖内置ng-model指令的自定义指令

ng-model是AngularJS的原生指令,通过require: ‘ngModel‘可以更加深入地处理数据的双向数据绑定。

ng-model里面的属性有:

$parsers:保存了从viewValue到modelValue绑定过程中的处理函数。

$formatters:保存了从modelValue到viewValue绑定过程中的处理函数。

$setViewValue:当AngularJS外部发生某件事情的时候,需要调用这个函数才能让AngularJS知道应该更新modelValue了。

$render:设定当model发生变化时该如何去更新view。

$setValidity:设置验证结果。

$viewValue:视图里的值。

$modelValue:模型里的值。

$parsers、$formatters和$setValidity的例子:

<!DOCTYPE html>
<html ng-app="myModule">

<head>
    <meta charset="utf-8">
</head>

<body>
    <article ng-controller="myController">
        <form name="myForm">
            <input type="text" name="evenInput" ng-model="data.even" even>
            <input type="text" ng-model="data.even" even>
            <section ng-show="myForm.evenInput.$error.even">
                只能为偶数
            </section>
        </form>
    </article>
    <script src="../JS/angular.min.js"></script>
    <script type="text/javascript">
    angular.module(‘myModule‘, [])
        .controller(‘myController‘, function() {

        })
        .directive(‘even‘, function() {
            return {
                require: ‘ngModel‘,
                link: function($scope, iElm, iAttrs, ngModelController) {
                    ngModelController.$parsers.push(function(viewValue) { //parser-语法分析器
                        if (viewValue % 2 === 0) {
                            ngModelController.$setValidity(‘even‘, true); //.$error.even为false
                        } else {
                            ngModelController.$setValidity(‘even‘, false); //.$error.even为true
                        }
                        return viewValue;
                    });
                    ngModelController.$formatters.push(function(modelValue) {
                        if (modelValue !== undefined) {
                            modelValue = modelValue + ‘ some words‘;
                        }
                        return modelValue;
                    });
                }
            };
        });
    </script>
</body>

</html>

$setViewValue、$render和$viewValue的例子:

<!DOCTYPE html>
<html ng-app="myModule">

<head>
    <meta charset="utf-8">
</head>

<body>
    <article ng-controller="myController">
        <my-content ng-model="someText"></my-content>
        <my-content ng-model="someText"></my-content>
    </article>
    <script src="../JS/angular.min.js"></script>
    <script type="text/javascript">
    angular.module(‘myModule‘, [])
        .controller(‘myController‘, function() {

        })
        .directive(‘myContent‘, function() {
            return {
                restrict: ‘E‘,
                template: ‘<div contenteditable="true"></div>‘,
                require: ‘ngModel‘,
                replace: true,
                link: function($scope, iElm, iAttrs, ngModelController) {
                    iElm.on(‘keyup‘, function() {
                        $scope.$apply(function() {
                            ngModelController.$setViewValue(iElm.html());
                        });
                    });
                    ngModelController.$render = function() {
                        iElm.html(ngModelController.$viewValue);
                    }
                }
            };
        });
    </script>
</body>

</html>
时间: 2024-08-29 08:40:45

依赖内置ng-model指令的自定义指令的相关文章

Angular中的内置指令和自定义指令

NG中的指令,到底是什么(what)? 为什么会有(why)?以及怎样使用(how)? What: 在NG中,指令扩展HTML功能,为 DOM 元素调用方法.定义行为绑定数据等. Why: 最大程度减少DOM操作,实现数据绑定,与业务逻辑进行交互. How: 指令主要分为两种:内置指令和自定义指令,通过下面的例子,简单记录一下如何去使用. 内置指令 在官方API文档上罗列了很多指令,内置指令可以分为:普通指令 和 事件指令,他们都是作用于HTML之上的,通过添加属性的方式来实现的.简单看一下一些

浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在html的脚本中使用自己在.net中定义的类,实现与Internet Explorer server的互操作.此外也可以在充分利用html在设计界面方面高效,简单的同时,也可以实现一些复杂的特性. 实现: Code Code highlighting produced by Actipro CodeH

vue内置指令与自定义指令

一.内置指令 1.v-bind:响应并更新DOM特性:例如:v-bind:href  v-bind:class  v-bind:title  v-bind:bb 2.v-on:用于监听DOM事件: 例如:v-on:click  v-on:keyup 3.v-model:数据双向绑定:用于表单输入等:例如:<input v-model="message"> 4.v-show:条件渲染指令,为DOM设置css的style属性 5.v-if:条件渲染指令,动态在DOM内添加或删除

C++ 内置宏定义 与 预编译指令

内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE____TIME__ __FUNCTION__ 2.预编译指令 可以防止头文件被多次引用 可以方便解决代码跨平台编译问题 可以根据自定义变量灵活执行程序 等等,许多好处 效果可以看代码实例: test.h 1 #ifndef __TEST_H 2 #define __TEST_H 3 4 #incl

AngularJS -- 指令(创建自定义指令)

什么是指令 注:本指南是针对已经熟悉AngularJS基础知识的开发人员.如果你才刚刚开始,我建议查看系列教程. 指令是一个Dom元素上的标签(和元素上的属性, CSS 类样式一样,属于这个Dom元素),它告诉AngualrJS的HTML 编译器($compile),去附加一个行为到这个Dom元素上去,这个行为可以改变这个Dom元素,或者这个Dom元素的子元素. AngularJS 有一套自己内置的指令,如:ngBind,ngModel,ngClass等等...你可以自定义的指令.当Angula

vue.js 学习四(指令和自定义指令)

官方的指令说明已经很简单了,这里再写一遍,也是自己加深一下印象 v-text 就是写入单纯的文本,可以忽略这个指令直接双花括号代替 <span v-text="msg"></span> <!-- 和下面的一样 --> <span>{{msg}}</span> v-html 更新元素的 innerHTML,如果取回的值里面包含了html的样式,可以使用这个指令. 以下抄写了官方注意事项,对于用户输入的HTML,显示的时候需要谨慎

Vue的土著指令和自定义指令

1.土著指令 当我开始学习Vue的时候,看官网的时候看到了"指令"两个字.我愣住了,what?指令是啥啊?后来继续往下看,像这种什么"v-for""v-show""v-if"都叫做指令.等到后来Vue玩的差不多了,开始写项目的时候发现,常见的指令也就那么几个,比如"v-if""v-show""v-model""v-for""v-bind&

20-基础-自定义指令-局部自定义指令

<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width,initial-scale=1.0'> <meta http-equiv='X-UA-Compatible' content='ie=edge'> <title>Document</title> </h

AngularJS内置指令

内置指令 所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突.首先从一些常见的内置指令开始.先列出一些关键的内置指令,顺便简单说说作用域的问题. ng-model 将表单控件和当前作用域的属性进行绑定,这么解释似乎也不太正确.但先不要管咬文嚼字,用起来倒是易懂,例如: 代码如下: <input type="text" ng-model="someModel.someProperty" /><br>{{someModel.som