Güncelleme:
Aynı işleve sahip önceki direktifin geliştirilmiş ve basitleştirilmiş sürümü (iki yerine bir):
.directive('myTestExpression', ['$parse', function ($parse) {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
var expr = attrs.myTestExpression;
var watches = attrs.myTestExpressionWatch;
ctrl.$validators.mytestexpression = function (modelValue, viewValue) {
return expr == undefined || (angular.isString(expr) && expr.length < 1) || $parse(expr)(scope, { $model: modelValue, $view: viewValue }) === true;
};
if (angular.isString(watches)) {
angular.forEach(watches.split(",").filter(function (n) { return !!n; }), function (n) {
scope.$watch(n, function () {
ctrl.$validate();
});
});
}
}
};
}])
Örnek kullanım:
<input ng-model="price1"
my-test-expression="$model > 0"
my-test-expression-watch="price2,someOtherWatchedPrice" />
<input ng-model="price2"
my-test-expression="$model > 10"
my-test-expression-watch="price1"
required />
Sonuç: Doğrulayıcıların diğerinin yönerge modelinin ve mevcut modelinin değiştirilmesi üzerine yürütüldüğü, karşılıklı olarak bağımlı test ifadeleri.
Test ifadesi, $model
diğer değişkenlerle karşılaştırmak için kullanmanız gereken yerel değişkene sahiptir.
Önceden:
Ekstra yönerge ekleyerek @Plantface kodunu geliştirmeye çalıştım. Bu ekstra yönerge, birden fazla ngModel değişkeninde değişiklik yapıldığında ifademizin yürütülmesi gerekiyorsa çok kullanışlıdır.
.directive('ensureExpression', ['$parse', function($parse) {
return {
restrict: 'A',
require: 'ngModel',
controller: function () { },
scope: true,
link: function (scope, element, attrs, ngModelCtrl) {
scope.validate = function () {
var booleanResult = $parse(attrs.ensureExpression)(scope);
ngModelCtrl.$setValidity('expression', booleanResult);
};
scope.$watch(attrs.ngModel, function(value) {
scope.validate();
});
}
};
}])
.directive('ensureWatch', ['$parse', function ($parse) {
return {
restrict: 'A',
require: 'ensureExpression',
link: function (scope, element, attrs, ctrl) {
angular.forEach(attrs.ensureWatch.split(",").filter(function (n) { return !!n; }), function (n) {
scope.$watch(n, function () {
scope.validate();
});
});
}
};
}])
Çapraz doğrulanmış alanlar oluşturmak için nasıl kullanılacağına örnek:
<input name="price1"
ng-model="price1"
ensure-expression="price1 > price2"
ensure-watch="price2" />
<input name="price2"
ng-model="price2"
ensure-expression="price2 > price3"
ensure-watch="price3" />
<input name="price3"
ng-model="price3"
ensure-expression="price3 > price1 && price3 > price2"
ensure-watch="price1,price2" />
ensure-expression
Değişkenler ng-model
veya ensure-watch
değişkenlerden herhangi biri değiştirildiğinde modeli doğrulamak için yürütülür .