Chris,
In my sample project for a simple angularJS module there is some sample code and a small readme.
https://github.com/patrickmcwilliams/angularJS_tealiumIQ-module
If you define a variable that wraps a utag.view() in your app controller and then use it in an "onload" on an ng-include or ng-view.
Alternatively, you can call the wrapper after a $routeChangeSuccess callback.
If all of this is still happening too soon because you have some other modules that are loading information asynchronously, then you may need to create a global object that keeps track of what modules should load for any given view and then at the completion of each module mark the global object as complete. Doing one final check for if all modules have completed and then calling utag.view() only after then.
example:
window.modules_loaded = {
mod1: false,
mod2:false,
mod3:false
}
at the completion of modx:
...
modules_loaded.modx=true;
var run_tealium = false;
for (var val in modules_loaded) {
run_tealium = val;
}
if (run_tealium){
utag.view({DATA});
}
Let me know if any of this helps, or if the info in git is helpful.