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

标签 javascript angularjs compilation transclusion

我需要创建一个指令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 中删除)。如何解决这个问题?

最佳答案

指令的内容在编译阶段被删除,因为您的指令具有 transinclude: 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/

相关文章:

parsing - 递归下降解析-从LL(1)起

javascript - 之后设置 Angular Controller 变量会发生变化吗?

javascript - 删除 Angular 文本中的空白

angularjs - Angular Material Design : mdThemingProvider and Color palettes, 如何使用它们

Html css 用 angularJS 证明故障

asp.net - 编译 ASP.NET 网站,某些引用未复制到临时 ASP.NET 文件文件夹

c++ - 如何将 sysroot 与 autoconf 一起使用?

javascript - 如何使用 css 添加过渡到内容

javascript - 由于双引号不同,XSS 有效负载未执行

javascript - 表单验证失败后如何显示模式?