2013-07-09 8 views
5

Jeśli spróbuję przefiltrować fragment z linky, dane wejściowe nie są już oczyszczone/renderowane/"html-ized". to znaczy chcę, aby być w stanie połączyć efekty zarówno:AngularJS: Czy możliwa jest dezynfekcja i połączenie w tej samej dyrektywie?

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

i

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

Oto skrzypce: http://jsfiddle.net/5uSnj/

+0

mam Grał z tym przez ostatnie 30 minut i wygląda na to, że filtr linkowy nie oczyszcza tagów HTML poprawnie. Wiele osób narzekało na to na talkbalk na kanciastej stronie dokumentacji. Próbowano za pomocą $ sanitize service, $ filter i combination - odnosząc się do skryptu JS angular-sanitise.js ... Pomyśl, że nie masz szczęścia przy korzystaniu z filtra. Być może stworzyć własną dyrektywę? – Lander

+0

Tak, stworzyłem nową dyrektywę w celu dezynfekcji i połączenia. Oto prośba o pobranie, zobaczymy, co mówią deweloperzy: https://github.com/angular/angular.js/pull/3285 – brooksbp

+0

Byłbym bardzo zainteresowany, aby z tego skorzystać. Czy fragment kodu @ Igora został przekształcony w skrypt instalujący bower? – meshy

Odpowiedz

0

przykro Igor Minar głosowałem odpowiedzieć, ale chcę zobaczyć zamieścić swoje funkcje bez innych usług:

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"

Powiązane problemy