首页 > 代码库 > form 表单
form 表单
angular 提供了表单指令,它和ng-model会有很密切的互动。
我们先来了解一下基本的ng-model
ng-model 通常放在input上,用来同步elem & scope 的数据
ng-model 在不同的element上会有不同的同步模式,这些angular已经帮我封装了许多 .
ng-model这个指令也提供了一些扩张接口 ,这个指令的controller 名为 ngModel
如果我们想在数据同步间做一些拦截,我们可以添加一个自定义指令来实现
<div ng-app="myApp"> <div ng-controller="ctrl"> <input type="text" ng-model="name" test /> </div> </div> angular.module("myApp", []). directive("test", [function () { return { restrict: "A", link: function ($scope, $element, $attrs, ctrls) { ctrls.$formatters.unshift(function (value) { console.log(value); return value + "123"; }); ctrls.$formatters.unshift(function (value) { console.log(value); return value + "456"; }); ctrls.$parsers.push(function (value) { console.log(value); return value; }); }, require : "ngModel" } }]). controller("ctrl", ["$scope", function ($scope) { $scope.name = "keatkeat"; }]);
通过require 引入 ng-model的controller到link中 , 调用 ctrl.$formatter 是个List<Fn> ,model 在同步数据时会逐一逆序(我也不知道为什么是逆序)调用里面的方法来处理value最终同步进input, (scope -> element) , 因为逆序所以我们放入时用了unshift
ctrl.$parsers 则相反 (element -> scope)
此外 ng-model 还有一些基本 option 可以调
<input type="text" name="userName" ng-model="user.name" ng-model-options="{ updateOn: ‘blur‘, debounce: 1000 ,getterSetter: true }"/><br />
<pre>user.name = <span ng-bind="user.name()"></span></pre>
updateOn 写入一个事件名来表示我们希望什么事件促使这个elem被更新,比如 blur / keyup 等
debounce 是deley update 毫秒, 一般我们不希望用户联系每一次keydown时都更新,而是等到用户停止输入时才执行一次更新。就可以放一个delay 实现了
getterSetter = true 可以用在依赖属性上,比如我们的$scope.name = function (){ retrun xx; } 当name是个方法的时候