I am using ng-bind-html for binding data that I get from database. 
<p ng-bind-html="myHTML"></p>   
app.controller('customersCtrl', function($scope, $http, $stateParams) {
    console.log($stateParams.id);
    $http.get("api link"+$stateParams.id)
    .then(function(response) {
      $scope.myHTML = response.data.content;
        // this will highlight the code syntax
        $('pre code').each(function(i, block) {
            hljs.highlightBlock(block);
        });
    });
});
When the data displayed on the screen, I want to run
$('pre code').each(function(i, block) {
      hljs.highlightBlock(block);
});
for highlight the code syntax in the data but it is not highlight. (I use highlight library in CKEditor for highlight the code syntax)
And if I delay load the highlight code after 1s, it will work but I think it is not a good solution
setTimeout(function () {
    $('pre code').each(function(i, block) {
        hljs.highlightBlock(block);
    });
  }, 1000);
I think maybe the highlight code run before ng-bind-html finished.
===
UPDATE
I am using $timeout with delay time 0 as some person recommend. However,  sometime when the network is slow and the page load slow, the code will not highlighted .
$scope.myHTML = response.data.content;
$timeout(function() {
  $('pre code').each(function(i, block) {
      hljs.highlightBlock(block);
  });
}, 0);
                This is where directives come in very handy. Why not append the HTML yourself and then run the highlighter?
Template:
<div ng-model="myHTML" highlight></div>
Directive:
.directive('highlight', [
    function () {
        return {
            replace: false,
            scope: {
                'ngModel': '='
            },
            link: function (scope, element) {
                element.html(scope.ngModel);
                var items = element[0].querySelectorAll('code,pre');
                angular.forEach(items, function (item) {
                    hljs.highlightBlock(item);
                });
            }
        };
    }
]);
Example: http://plnkr.co/edit/ZbcNgfl6xL2QDDqL9cKc?p=preview
So here's what is happening:
$scope.myHTML valueeach() loopNotice that the digest cycle runs after your jQuery each() loop -- or, more specifically, after your $http callback function is finished running.
That means the value of $scope.myHTML in your controller is not applied to the ng-bind-html directive until after your loop has already finished.
To overcome this, you could use Angular's $timeout service instead of the native browser setTimeout() method. By default, $timeout will invoke the callback function during the next digest cycle, which means it will run after the changes to $scope.myHTML are applied to the ng-bind-html directive (as long as you update $scope.myHTML before calling $timeout()).
Working example: JSFiddle
as you know the statements execute asynchronously, if there is no timeout $('pre code') will be empty as the DOM is still not rendered. use $timeout instead of setTimeout for the same.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With