这个自定义验证指令是在官方角点的一个例子。
http://docs.angularjs.org/guide/forms
它检查文本输入是否是数字格式。
http://docs.angularjs.org/guide/forms
它检查文本输入是否是数字格式。
- var INTEGER_REGEXP = /^\-?\d*$/;
- app.directive('integer',function() {
- return {
- require: 'ngModel',link: function(scope,elm,attrs,ctrl) {
- ctrl.$parsers.unshift(function(viewValue) {
- if (INTEGER_REGEXP.test(viewValue)) {
- // it is valid
- ctrl.$setValidity('integer',true);
- return viewValue;
- } else {
- // it is invalid,return undefined (no model update)
- ctrl.$setValidity('integer',false);
- return undefined;
- }
- });
- }
- };
- });
要单元测试这段代码,我写道:
- describe('directives',function() {
- beforeEach(module('exampleDirective'));
- describe('integer',function() {
- it('should validate an integer',function() {
- inject(function($compile,$rootScope) {
- var element = angular.element(
- '<form name="form">' +
- '<input ng-model="someNum" name="someNum" integer>' +
- '</form>'
- );
- $compile(element)($rootScope);
- $rootScope.$digest();
- element.find('input').val(5);
- expect($rootScope.someNum).toEqual(5);
- });
- });
- });
- });
然后我得到这个错误:
- Expected undefined to equal 5.
- Error: Expected undefined to equal 5.
另一个答案的测试应该写成:
- describe('directives',function() {
- var $scope,form;
- beforeEach(module('exampleDirective'));
- beforeEach(inject(function($compile,$rootScope) {
- $scope = $rootScope;
- var element = angular.element(
- '<form name="form">' +
- '<input ng-model="model.somenum" name="somenum" integer />' +
- '</form>'
- );
- $scope.model = { somenum: null }
- $compile(element)($scope);
- form = $scope.form;
- }));
- describe('integer',function() {
- it('should pass with integer',function() {
- form.somenum.$setViewValue('3');
- $scope.$digest();
- expect($scope.model.somenum).toEqual('3');
- expect(form.somenum.$valid).toBe(true);
- });
- it('should not pass with string',function() {
- form.somenum.$setViewValue('a');
- $scope.$digest();
- expect($scope.model.somenum).toBeUndefined();
- expect(form.somenum.$valid).toBe(false);
- });
- });
- });
注意$ scope。$ digest()现在在$ setViewValue之后被调用。这将形式设置为“脏”状态,否则它将保持“原始”,这可能不是你想要的。