RegExp が一致しない場合、このディレクティブは検証に失敗することを除いて、ngPattern に似たカスタム AngularJS ディレクティブを作成しようとしています。
ngPattern ディレクティブのソースに従って、次のことを思いつきました。
.directive("notPattern", function () {
return {
restrict: "A",
require: "?ngModel",
link: function (scope, elem, attr, ctrl) {
if (!ctrl) return;
var regExp, notPatternExp = attr.notPattern;
attr.$observe("notPattern", function (regex) {
if (angular.isString(regex) && regex.length > 0) {
regex = new RegExp("^" + regex + "$");
}
if (regex && !regex.test) {
var elemClone = angular.element(elem).clone();
var elemHtml = angular.element("<div>").append(elemClone).html();
throw new Error("Expected " + notPatternExp + " to be a RegExp but was " + regex + ". Element: " + elemHtml);
}
regExp = regex || undefined;
ctrl.$validate();
});
ctrl.$validators.notpattern = function (value) {
return ctrl.$isEmpty(value) || angular.isUndefined(regExp) || !regExp.test(value);
};
}
};
})
これは、属性内で正規表現ソースを指定すると機能しますが、RegExp
ngPattern のように、オブジェクトを直接使用できるようにしたいと考えています。
問題は、式が評価されていないことです。
JSFiddle の例を次に示します:
http://jsfiddle.net/8Lk3pqep/1/
この例では、テキスト フィールドに「abc」以外を入力すると、「Invalid per 'pattern'!」と表示されます。「'notpattern' ごとに無効です!」と表示されることを期待していました。「abc」が入力されたときですが、これは「testRegExp」を入力したときにのみ表示されるため、属性値が評価されていないことを示しています。
私は何を間違っていますか?
notPattern は、次のような方法で ngPattern で実現できることを知っています。
$scope.testRegExp = {
test: function (value) {
return !/^abc$/.test(value);
}
};
..しかし、カスタムディレクティブが式を評価していない理由を知りたいです。