我正在使用 AngularJS 来发现它的强大功能,但我不得不承认文档不是很发达,所以我在这里向社区询问我在嵌套指令方面面临的问题。
我更多的是寻找原因(以及我做错了什么的解释)而不是完成的解决方案。
所以事情就是这样(我正在使用角度消息,但我认为这并不重要,因为这个问题对于任何指令都是常见的):
为了快速更改错误管理,我决定将管理器(此处为 angular-messages)封装到指令中,因此要在表单上显示我的错误,我会这样做:
<script type="text/ng-template" id="default-error-messages">
<error-message data-error="email" data-message="This field is not a valid email"></error-message>
<error-message data-error="required" data-message="This field is required"></error-message>
<error-message data-error="minlength" data-message="This field is too short"></error-message>
</script>
<form data-ng-submit="submitForm(registrationForm)" method="POST" name="registrationForm" novalidate>
<input type="email" name="email" data-ng-model="user.email" required>
<error-container data-watch-error-on="registrationForm.email.$error" data-default-errors="default-error-messages" data-ng-if="registrationForm.email.$dirty">
<error-message data-error="required" data-message="test"></error-message>
</error-container>
<button type="submit" data-ng-disabled="registrationForm.$invalid">Register</button>
</form>
directives.directive('errorContainer', ['$compile',function($compile){
return{
restrict: 'E',
transclude: true,
replace: false,
scope: {
watchErrorOn: '@'
},
template: '<div class="error-container" data-ng-transclude></div>',
compile: function(tElt, tAttrs, ctrl) {
return {
pre: function(scope, iElement, iAttrs){
iElement.find('.error-container').attr("data-ng-messages", scope.watchErrorOn);
},
post: function(scope, iElement, iAttrs){
if (angular.isDefined(iAttrs.defaultErrors)) {
var errorList = angular.element("<div data-ng-messages-include='" + (iAttrs.defaultErrors || 'default-error-messages') + "'></div>");
iElement.find('.error-container').append(errorList);
$compile(iElement)(scope);
}
}
}
},
link: function(scope, element, attrs, ctrl){
$compile(element)(scope);
}
}
}]);
directives.directive('errorMessage', ['$compile', function($compile){
return{
restrict: 'E',
template: '<div class="error"></div>',
replace: true,
scope:{
message:'@',
error:'@'
},
compile: function(tElt, tAttrs, ctrl){
return{
pre: function(scope, iElement, iAttrs){
iElement.attr('data-ng-message', scope.error);
iElement.text(scope.message);
}
}
}
}
}]);
您肯定知道,它不起作用,模板中根本不包含默认错误。我在预/后编译功能和链接上尝试了很多组合,但没有成功。我认为这是编译优先级的问题,也许 ng-messages-include 应该是最后一个编译但不知道如何编译,提前谢谢