AngularJS:可以在同一指令中清除和链接

AngularJS: Possible to sanitize and linky in same directive?

本文关键字:指令 清除 链接 AngularJS      更新时间:2023-09-26

如果我尝试用linky过滤snippet,则输入将不再经过净化/渲染/'html-ized'。即,我希望能够将两者的效果结合起来:

<div ng-bind-html="snippet"></div>

<div ng-bind-html="snippet | linky"></div>

这是小提琴:http://jsfiddle.net/5uSnj/

linky将文本作为输入,而不是html。如果你想要一个以html作为输入的过滤器,那么它的工作方式就必须完全不同。请参阅:https://github.com/angular/angular.js/pull/3285#issuecomment-21958391

对不起,Igor Minar我投票给了你答案,但我想看到在没有其他服务的情况下发布你的功能:

    app.filter('htmlLinky', function($sanitize, linkyFilter) {
  var ELEMENT_NODE = 1;
  var TEXT_NODE = 3;
  var linkifiedDOM = document.createElement('div');
  var inputDOM = document.createElement('div');
  var linkify = function linkify(startNode) {
    var i, ii, currentNode;
    for (i = 0, ii = startNode.childNodes.length; i < ii; i++) {
      currentNode = startNode.childNodes[i];
      switch (currentNode.nodeType) {
        case ELEMENT_NODE:
          linkify(currentNode);
          break;
        case TEXT_NODE:
          linkifiedDOM.innerHTML = linkyFilter(currentNode.textContent);
          i += linkifiedDOM.childNodes.length - 1
          while(linkifiedDOM.childNodes.length) {
            startNode.insertBefore(linkifiedDOM.childNodes[0], currentNode);
          }
          startNode.removeChild(currentNode);
      }
    }
    return startNode;
  };
  return function(input) {
    inputDOM.innerHTML = input;
    return linkify(inputDOM).innerHTML;
  };
});

ng bind html="html|htmlLinky"