This is related to angular digest cycle, it’s about how angular works underneath the hood, data binding etc. There are great tutorials explaining this.
To solve your problem, use $timeout, it will make the code execute on the next cycle, whem the ng-if was already parsed:
app.controller('LoginController', function ($scope, $timeout) {
$scope.$on('$viewContentLoaded', function(event) {
$timeout(function() {
$scope.formData.value = document.getElementById("loginForm").id;
},0);
});
});
Fixed demo here: http://codepen.io/anon/pen/JoYPdv
But I strongly advise you to use directives do any DOM manipulation, the controller isn’t for that.
Here is a example of how do this:
Easy dom manipulation in AngularJS – click a button, then set focus to an input element