Использование $templateCache в шаблоне ui-router

Можно ли использовать шаблон $templateCache в шаблоне ui-router?

Шаблон будет кэширован в разделе разрешений, и я хочу использовать кешированный шаблон в том же состоянии.

$stateProvider
.state('dashboard', {
    url: "/dashboard",
    template: function($templateCache){  
        console.log('test 2');
        return $templateCache.get('templates/template1.html'); // returns undefined
    },
    resolve:{
        baseTemplates: function($ocLazyLoad) {
            // here the template will be cached...
            return $ocLazyLoad.loadTemplateFile(['base/dashboard.html']).then(function(){
                console.log('test 1');
            });
        }
    }
})
// console prints "test 2" before than "test 1"

Обновление: (+ обновленный код)

Я думаю, что в разделе решения моего кода есть проблема. потому что он работает после раздела шаблона! и это вызывает возврат $templateCache.get undefined.

Я использую плагин ocLazyLoad для кэширования шаблона, и он возвращает правильное обещание.

Почему шаблон не ждет разрешения?

Ответ 1

Способ динамического задания динамического шаблона не выполняется с помощью свойства template, а templateProvider. Существует рабочий plunker, и это фрагмент:

// this is a run event (executed after config in fact)
// in which we do inejct a value into $templateCache
.run(function($templateCache){ 
    // this could be lazy... elswhere
    $templateCache.put('templates/template1.html'
    , '<div><h4>dashboard</h4></div>');
  })
.config(function($stateProvider, $urlRouterProvider) {

    $urlRouterProvider.otherwise('/dashboard');

    $stateProvider.state('dashboard', {
      url: '/dashboard', 
      // this is the place where to resolve dynamic template
      templateProvider: function($templateCache){  
        // simplified, expecting that the cache is filled
        // there should be some checking... and async $http loading if not found
        return $templateCache.get('templates/template1.html'); 
      },
    })
});

См:

А также, я бы сказал, что не у вас может использовать $templateCache, но он уже используется ui-router. Основная служба, отвечающая за загрузку шаблонов (из url, string...) для наших просмотров, это:

который, как показывает его код, использует $templateCache как естественную оптимизацию ($templateFactory фрагмент кода:)

...
/**
* @ngdoc function
* @name ui.router.util.$templateFactory#fromUrl
* @methodOf ui.router.util.$templateFactory
*
* @description
* Loads a template from the a URL via `$http` and `$templateCache`.
*
* @param {string|Function} url url of the template to load, or a function
* that returns a url.
* @param {Object} params Parameters to pass to the url function.
* @return {string|Promise.<string>} The template html as a string, or a promise
* for that string.
*/
this.fromUrl = function (url, params) {
    if (isFunction(url)) url = url(params);
    if (url == null) return null;
    else return $http
        .get(url, { cache: $templateCache })
        .then(function(response) { return response.data; });
};
...

Ответ 2

Ну, я просто узнал, что вы можете просто установить ключ вашего шаблона $templateCache в качестве свойства маршрута templateUrl, и он отлично работает.

Ответ 3

Я не знаю, была ли она уже решена, однако я решил обновить свой шаблон следующим образом. Я помню, что я использую AngularAMD/AngularUIRouter, но шаблонURL работает одинаково. Я использую функцию в templateURL, где каждый раз передаю параметр "xxx", равный новой дате, и это снова заставляет поиск страницы. Надеюсь, я хорошо помог.

.state ('MyReports', {
    parent: 'index',
    url: '/MyReports/:cd_menu',
    views: {
        'BodyView': angularAMD.route ({templateUrl: function (params) {
        return "MyReportsAction/getTemplate?cd_menu="+ params.cd_menu + "&xxx="+ new Date();
    },
    controllerUrl: 'js/app/base/controllers/MyReportsController',
    controller: 'MyReportsController'})
}
})

Как только это будет сделано, приведенный ниже код работает как ожидалось:

$state.go('MyReports', {'cd_menu': cd_menu});