2013-07-09 4 views
5

linkyでスニペットをフィルタリングしようとすると、入力はもはや消されていない/レンダリングされ/ 'html化されました'。すなわち、私は両方の効果を組み合わせることができるようにしたい:AngularJS:同じ指令で消毒してリンカーできる?

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

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

ここでフィドルです:http://jsfiddle.net/5uSnj/

+0

私はしましたこれと最後の30分間演奏され、リンクフィルタがHTMLタグを適切にサニタイズしないようです。角度のあるドキュメントサイトのトークボークで、多くの人がそれに不平を感じています。 $ sanitizeサービス、$ filterおよび組み合わせを使用して試しました - JSスクリプトang-sanitise.jsを参照しようとしました... フィルタを使用して運が悪いと思います。おそらくあなた自身の命令を作るでしょうか? – Lander

+0

うんざりして、墨塗りとリンケージのための新しい指令を作成しました。ここでプルリクエストがありますが、開発者の言うことが分かります:https://github.com/angular/angular.js/pull/3285 – brooksbp

+0

私はこれを使用することに非常に興味があります。 @Igorのスニペットはインストール可能なスクリプトになっていますか? – meshy

答えて

0

申し訳ありませんイゴール・ミナールを私はあなたが答えるが、私は他のサービスなしで、あなたの関数を投稿見たい投票:

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-バインドのhtml = "HTML | htmlLinky"