I know this might get an answer here, however that goes more for lazy loading implementation itself.
So, this is a typical UI-Router
config block:
app.config(function($stateProvider, $urlRouterProvider, $injector) {
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'view_home.html', // Actually SHOULD BE result of a XHR request ....
controller: 'HomeCtrl'
});
});
But what if I want to load such templateUrl
when it's requested ($stageChangeStart
) and it would be AJAX request based.
How should it be implemented? How are LARGE angular applications dealing with this?
We should (in this case) use TemplateProvider
. Small cite from doc:
Templates
TemplateUrl
... templateUrl
can also be a function that returns a url. It takes one preset parameter, stateParams
, which is NOT injected.
TemplateProvider
Or you can use a template provider function which can be injected, has access to locals, and must return template HTML, like this:
$stateProvider.state('contacts', {
templateProvider: function ($timeout, $stateParams) {
return $timeout(function () {
return '<h1>' + $stateParams.contactId + '</h1>'
}, 100);
}
})
And there is even more.
We can use cooperation with really powerful
$templateRequest
In this Q & A (Angular UI-Router dynamic routing based on slug from API Ajax Call. Load view based on slug) we can see so simple templateProvider
defintion
.state('hybrid', {
// /john-smith
url: '/:slug',
templateProvider: ['type', '$templateRequest',
function(type, templateRequest)
{
var tplName = "tpl.partial-" + type + ".html";
return templateRequest(tplName);
}
],
and the result is also chached...
There are some other links to similar Q & A, including working examples
- Angular UI Router: decide child state template on the basis of parent resolved object
- Angular and UI-Router, how to set a dynamic templateUrl