zoukankan      html  css  js  c++  java
  • 关于ngModelOptions用法总结 让校验不过的验证绑定ngModel

    今天先来说说ngModelOption

    我们项目用angular做了个校验标签。当输入非法的时候,会提示错误的提示框。

    需求

    两个输入框 需要互动,

    左边的是最小字数 , 右边的是最大字数。
    左边< 右边的字数
    感觉很简单

    问题

    其中有一种情况是这样
    1 左边先输入33, 右边输入22.
    2 正确情况下 右边报错,我修改左边的33为3.
    3 但是右边的报错没有消失

    我写了各种逻辑,最后发现就是无法拿到右边的值

    正常情况下

    但是 验证不通过

    很明显是无法绑定!!!

    弯路

    刚开始以为是组件库捣鬼,翻看了组件库的东西也并没有得到很好的解决
    然后发现异步可以拿到,但是这样子两个框互相异步调用,很容易造成死循环

    解决

    请教了一个angular方面的污神
    扔了一堆图片和解释,大神鄙夷的看了我一眼。给我抛出
    ngModelOptions 和官方链接
    我当时的第一反应是这样的

    印象中这个不就什么时候同步ngModel的吗?
    好吧 我耐心看完 顺便简单记录一下

    updataOn 指定ng-model以什么绑定事件触发

    default 就是默认的大家都知道
    blur 失去焦点的时候更新
    mouseover 鼠标滑过
    .......

    <input type="text" ng-model="name" ng-model-options="{updateOn: 'blur'}">
    <p>Hello{{name}}</p>
    

    debounce 延迟更新

    debounce 以毫秒为单位

    <input type="text" ng-model="name" ng-model-options="{debounce: 1000}">
    <p>Hello{{name}}</p>
    

    它的用法,其实很多比如再搜索的时候,当用户实时输入,数据模型更新,会频繁向后端请求。通过延迟更新模型,大大提高性能。

    allowInvalid 是否需要验证后绑定数据 (此处就可以解决刚刚我遇到的问题)

    allowInvalid 默认值为false

    <input type="email" ng-model="name" ng-model-options="{allowInvalid: true}">
    <p>Hello{{name}}</p>
    

    getterSetter 是否绑定到getters/setters函数上

    其实 不是很懂这个用法
    getterSetter默认值为 false

    如果不绑定 ngModelOptions

    <div ng-controller="myController">
        <form name="userForm">
            Name: <input Type="text" name="userName"
                         ng-model="user.name"/>
        </form>
        <pre>user.name = <span ng-bind="user.name()"></span></pre>
    </div>
    
    
    <script type="text/javascript">
        var m1 = angular.module('app', []);
        m1.controller('myController', ['$scope', function ($scope) {
            var _name = 'MAYUFO';
            $scope.user = {
                name: function (newNAME) {
                    return angular.isDefined(newNAME) ? (_name = newNAME) : _name;
                }
            }
        }]);
    </script>
    
    

    结果

    如果使用了ngModelOptions

    <div ng-controller="myController">
        <form name="userForm">
            Name: <input Type="text" name="userName"
                         ng-model="user.name"
                         ng-model-options="{ getterSetter: true }"/>
        </form>
        <pre>user.name = <span ng-bind="user.name()"></span></pre>
    </div>
    
    
    <script type="text/javascript">
        var m1 = angular.module('app', []);
        m1.controller('myController', ['$scope', function ($scope) {
            var _name = 'MAYUFO';
            $scope.user = {
                name: function (newNAME) {
                    return angular.isDefined(newNAME) ? (_name = newNAME) : _name;
                }
            }
        }]);
    </script>
    

    结果

    timezone

    主要用在<input type ='day'> <input type='time'>中,可以指定时区utc或者直接输入时差+0430

    <input type="date" ng-model="$ctrl.date" ng-model-options="{timezone: '+0430'}">
    	<p ng-bind="$ctrl.date"></p>
    
    	<input type="date" ng-model="$ctrl.datea" >
    	<p ng-bind="$ctrl.datea"></p>
    

    $rollbackViewValue 同步模型和视图

    resetWithRollback(e) {
    		if (e.keyCode === 27) {
    			this.myForm1.myInput1.$rollbackViewValue();
    		}
    	}
    
    <form role="form" name="$ctrl.myForm1" ng-model-options="{ updateOn: 'blur' }">
    		<input type="name" name="myInput1" ng-model="$ctrl.view1" ng-keydown="$ctrl.resetWithRollback($event)">
    </form>
    <p>{{$ctrl.view1}}</p>
    

    好了 终于看完了所有的ngModelOptions的用法。
    希望有朝一日,也能在小白面前装逼成功

  • 相关阅读:
    switch语句(上)(转载)
    MSIL实用指南-生成if...else...语句
    Docker 部署Jira8.1.0
    K8S从入门到放弃系列-(13)Kubernetes集群mertics-server部署
    K8S踩坑篇-master节点作为node节点加入集群
    K8S从入门到放弃系列-(12)Kubernetes集群Coredns部署
    K8S从入门到放弃系列-(11)kubernetes集群网络Calico部署
    K8S从入门到放弃系列-(10)kubernetes集群之kube-proxy部署
    K8S从入门到放弃系列-(9)kubernetes集群之kubelet部署
    K8S从入门到放弃系列-(8)kube-apiserver 高可用配置
  • 原文地址:https://www.cnblogs.com/mayufo/p/6113612.html
Copyright © 2011-2022 走看看