Angular: ng-bind-html filters out ng-click?

前端 未结 3 1439
暖寄归人
暖寄归人 2020-11-29 04:55

I have some html data that I\'m loading in from a json file.

I am displaying this html data by using ngSanitize in my app and using ng-bind-html.

Now I woul

相关标签:
3条回答
  • 2020-11-29 05:03

    I still faced some issue with the compile, as that was not fulfilling my requirement. So, there is this, a really nice and easy hack to work around this problem.

    We replace the ng-click with onClick as onClick works. Then we write a javascript function and call that on onClick event. In the onClick function, we find the scope of the anchor tag and call that required function explicitly.

    Below is how its done :)

    Earlier,

    <a id="myAnchor" ng-click="myControllerFunction()" href="something">
    

    Now,

    <a id="myAnchor" onClick="tempFunction()" href="something">
    

    at the bottom or somewhere,

    <script>
    function tempFunction() {
     var scope = angular.element(document.getElementById('myAnchor')).scope();
      scope.$apply(function() {
        scope.myControllerFunction();
     });
    }
    </script>
    

    This should work now. Hope that helps someone :)

    For more info, see here.

    0 讨论(0)
  • 2020-11-29 05:04

    Ok, so the issue is that it isn't compiling the html you include (angular isn't parsing it to find directives and whatnot). Can't think of a way to make it to compile from within the controller, but you could create a directive that includes the content, and compiles it.

    So you would change

    <p ng-bind-html="name"></p>
    

    to

    <p compile="name"></p>
    

    And then for the js:

    var myApp = angular.module('myApp', ['ngSanitize']);
    angular.module('myApp')
    .directive('compile', ['$compile', function ($compile) {
      return function(scope, element, attrs) {
        scope.$watch(
          function(scope) {
            return scope.$eval(attrs.compile);
          },
          function(value) {
            element.html(value);
            $compile(element.contents())(scope);
          }
       )};
      }]).controller('MyCtrl', function($scope) {
        var str = 'hello http://www.cnn.com';
        var urlRegEx = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-]*)?\??(?:[\-\+=&;%@\.\w]*)#?(?:[\.\!\/\\\w]*))?)/g;
        result = str.replace(urlRegEx, "<a ng-click=\"GotoLink('$1',\'_system\')\">$1</a>");
        $scope.GotoLink = function() { alert(); }
        $scope.name = result;
    });
    

    Angular 1.2.12: http://jsfiddle.net/7k8xJ/4/

    Angular 1.4.3: http://jsfiddle.net/5g6z58yy/ (same code as before, but some people were saying it doesn't work on 1.4.*)

    0 讨论(0)
  • 2020-11-29 05:09

    Explicitly Trusting HTML With $sce When you want Angular to render model data as HTML with no questions asked, the $sce service is what you’ll need. $sce is the Strict Contextual Escaping service – a fancy name for a service that can wrap an HTML string with an object that tells the rest of Angular the HTML is trusted to render anywhere.

    In the following version of the controller, the code asks for the $sce service and uses the service to transform the array of links into an array of trusted HTML objects using $sce.trustAsHtml.

    app.controller('XYZController', function ($scope, $sce) {
    
    $sce.trustAsHtml("<table><tr><td><a onclick='DeleteTaskType();' href='#workplan'>Delete</a></td></tr></table>");
    
    0 讨论(0)
提交回复
热议问题