はjsfiddleです:http://jsfiddle.net/javajunkie314/r6oyLe26/3/
アイデアがmyValidator
とmyErrorMessage
ディレクティブはmyErrorHandler
ディレクティブを経由して、そのエラーメッセージを同期させることです。うーん、私はreject
に渡された理由にバリデーターでアクセスする方法を見つけることができません。
編集:私はフィドルを更新しました。現在、myValidator
は2つの非同期バリデータを使用しています。また、コントローラmyErrorHandler
の更新を処理するためにValidatorPromise
を作成しました。これは私のコメントで説明したとおりです。
HTML:
<form ng-controller="testCtrl">
<div my-error-handler="">
<input type="text" name="foo" ng-model="foo.text" my-validator="">
<div my-error-message=""></div>
</div>
</form>
はJavaScript:
(function() {
var app = angular.module('myApp', []);
/* Wraps a promise. Used to update the errorHandler controller when the
* validator resolves. */
app.factory('ValidatorPromise', function ($q) {
return function (errorHandler, name, promise) {
return promise.then(
// Success
function (value) {
// No error message for success.
delete errorHandler.error[name];
return value;
},
// Failure
function (value) {
// Set the error message for failure.
errorHandler.error[name] = value;
return $q.reject(value);
}
);
};
});
app.controller('testCtrl', function ($scope) {
$scope.foo = {
text: ''
};
});
app.directive('myErrorHandler', function() {
return {
controller: function() {
this.error = {};
}
};
});
app.directive('myValidator', function ($timeout, $q, ValidatorPromise) {
return {
require: ['ngModel', '^myErrorHandler'],
link: function (scope, element, attrs, controllers) {
var ngModel = controllers[0];
var myErrorHandler = controllers[1];
ngModel.$asyncValidators.test1 = function() {
return ValidatorPromise(
myErrorHandler, 'test1',
$timeout(function() {}, 1000).then(function() {
return $q.reject('Fail 1!');
})
);
};
ngModel.$asyncValidators.test2 = function() {
return ValidatorPromise(
myErrorHandler, 'test2',
$timeout(function() {}, 2000).then(function() {
return $q.reject('Fail 2!');
})
);
};
}
};
});
app.directive('myErrorMessage', function() {
return {
require: '^myErrorHandler',
link: function (scope, element, attrs, myErrorHandler) {
scope.error = myErrorHandler.error;
},
/* This template could use ngMessages to display the errors
* nicely. */
template: 'Error: {{error}}'
};
});
})();
どのように非同期を設定しますかバリデーション、バリデーター – dfsq
私が持っていたのとまったく同じ質問です。未回答のまま残っていましたが、何も組み込みませんでしたので、私はハックしました。今回はエキスパートから回答が得られるかどうか確認してください – harishr
@dsfq、それは問題ではありませんが、ここに私のバリデーターへのリンクがあります:https://github.com/exceptionless/Exceptionless.UI/blob/master/src/ components/validators/search-filter-validator.jsとマークアップへのリンクhttps://github.com/exceptionless/Exceptionless.UI/blob/master/src/components/search-filter/search-filter-directive.tpl .html#L10-L26 –