why does it happen?
Your browser will render the HTML, and angular will be just a bit later with it's DOM manipulation
solution 1: ng-bind
You can use <h1 ng-bind="hello"></h1>
to fill your H1 tag.
Because there is no HTML inside the H1 tag to render, you will not see it flash with the {{hello}} notation when angular hasn't done it's magic yet.
I think the downside for this is that you always need to have a wrapping element around the content you want to show.
https://docs.angularjs.org/api/ng/directive/ngBindHtml
solution 2: ng-cloak
You can use ng-cloak to wrap anything you want to hide as long as angular is not ready.
It would look like:
<h1 ng-cloak>{{ 'hello' }}</h1>
or <h1 class="ng-cloak">{{ 'hello' }}</h1>
in your case.
The benefit I see in ng-cloak is that you can use it to wrap around a larger area.
You could use ng-cloak to hide your whole angular-affected area, and display a loader animation while angular is not up and running.
https://docs.angularjs.org/api/ng/directive/ngCloak