gpt4 book ai didi

javascript - 从 ng-messages 中提取 ng-message key

转载 作者:行者123 更新时间:2023-11-30 16:58:24 25 4
gpt4 key购买 nike

我需要创建一个指令 myDirective 来读取其中的所有 ng-message 键,并且它仍然创建一个有效的 ng-messages 元素:

指令模板:

<div id="myDirective">
<div ng-messages="myform.$error" ng-transclude></div>
</div>

用法:

<my-directive>
<div ng-message="required">something is required</div>
<div ng-message="custom">custom validation</div>
</my-directive>

所以在这种情况下,我想获得一个包含“必需”和“自定义”的数组。问题是我不能这样做,因为当我的指令进入它自己的链接函数时,所有 ng-messsage 元素都已经隐藏(从 DOM 中删除以更准确)。如何解决这个问题?

最佳答案

指令的内容在编译阶段被删除,因为你的指令有 transclude: true(我假设是这样,因为你正在使用 ng-transclude) .

在这种情况下,可以通过传入的 transclude 函数获取内容(这实际上是 ng-transclude 在幕后使用的)。

transclude 函数是 link(或预链接)函数的第 5 个参数:

link: function(scope, element, attrs, ctrls, transclude){
var transcludedContents; // jqLite of the contents

transclude(function(clone){
transcludedContents = clone;
});

// do whatever you do to extract ng-message values from transcludedContents
// just remember, that it could also come in the form:
// <ng-message when="required"> and
// <div ng-message-exp="errorMessage.type">
}

可能我们当中比较懒的人不想处理 DOM 计数,因此您可以为 ng-message 指令创建另一个处理程序,它与您的 my-directive 交互注册自己:

.directive("myDirective", function() {
return {
transclude: true,
templateUrl: "myDirective.template.html",
controller: function() {
var messages = [];
this.registerNgMessage = function(val) {
messages.push(val);
};
}
};
})
.directive("ngMessage", complementaryNgMessageDirective)
.directive("ngMessageExp", complementaryNgMessageDirective);

function complementaryNgMessageDirective() {
return {
priority: 10, // must be higher than ngMessage, because ngMessage is terminal
require: "^?myDirective", // must be optional not to break existing code
link: function(scope, element, attrs, myDirectiveCtrl) {

if (!myDirectiveCtrl) return; // do nothing, if not paired with myDirective

var staticExp = attrs.ngMessage || attrs.when;
var dynamicExp = attrs.ngMessageExp || attrs.whenExp;

var val;
if (dynamicExp) {
val = scope.$eval(dynamicExp);
} else {
val = staticExp;
}

myDirectiveCtrl.registerNgMessage(val);
}
};
}

关于javascript - 从 ng-messages 中提取 ng-message key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com