在我下面的臭名昭着的验证指令中,我将所需验证函数的名称作为参数传递给基于属性的指令:
MyBigApp.directive("mlNgValidations", function ($compile) {
var valAttributes = {
phoneNumber: function (element) {
element.attr("ng-pattern", "/^[0-9]+$/");
element.attr("ng-minlength", 5);
element.attr("ng-maxlength", 8);
}
}
return {
priority: 10000,
terminal: true,
link: function (scope, element, attrs) {
var validationType = attrs.mlNgValidations;
valAttributes[validationType](element);
element.removeAttr("ml-ng-validations");
$compile(element)(scope);
}
};
});
如果我声明一个带有错误验证功能的元素,例如:
<input type="text" class="form-control" ml-ng-validations="phooneNumber" />
我得到了非意料之外的异常:
TypeError:valAttributes [validationType]不是函数
我希望至少提供更多信息,最好不要定义新的异常,可能是这样的:
TypeError:验证函数phooneNumber未定义
我怎样才能做到这一点?
答案 0 :(得分:0)
在这种情况下,您似乎拥有调用非函数的代码:不要。一盎司的预防值得一磅治疗。
MyBigApp.directive("mlNgValidations", function ($compile) {
var valAttributes = {
phoneNumber: function (element) {
element.attr("ng-pattern", "/^[0-9]+$/");
element.attr("ng-minlength", 5);
element.attr("ng-maxlength", 8);
}
}
return {
priority: 10000,
terminal: true,
link: function (scope, element, attrs) {
var validationType = attrs.mlNgValidations;
var fn = valAttributes[validationType];
if (typeof fn !== "function") {
throw new Error("Validation function " + validationType + " is not defined");
}
fn(element);
element.removeAttr("ml-ng-validations");
$compile(element)(scope);
}
};
});
如果您不拥有调用代码,则可以使用常规try .. catch
,如果您拥有一些包含调用代码的代码。对于类似这样的事情,这似乎不太可能,而且你会遇到像Firefox window.onerror这样丑陋的浏览器特定的黑客攻击。这至少会让你捕获异常并检查它,可能会将其重新抛出为你自己的更具描述性的错误。这对我来说似乎不值得。