Angular主模块依赖于$ templateCache.run()(子模块)

时间:2016-01-25 09:00:50

标签: javascript angularjs angular-templatecache

我正在尝试使用$templateCache并拥有以下代码:

我的所有模板都是用templates.js编译的:

angular.module("gm.templates", []).run(["$templateCache", function($templateCache) {$templateCache.put("/app/app-mc3.html","<div class=.......

我的主app.js像这样加载

angular.module('app', ['ui.router', 'ct.ui.router.extras', 'gm.templates',.....

我在加载templates.js文件之前加载app.js,但是当我尝试在我的某个服务中使用$templateCache时,它已定义但为空,表示没有模板已经装好了。

以下是我的应用中$templateCache.info()的一些日志。

ClientService-0.1.5.js:2 Object {id: "templates", size: 0}
ClientService-0.1.5.js:27 /app/app-mc3.html
ClientService-0.1.5.js:28 Object {} // console.log($templateCache)
ClientService-0.1.5.js:29 undefined // Trying to find a specific template in the $templateCache
ClientService-0.1.5.js:2 Object {id: "templates", size: 72}
app-0.1.5.js:3 Object {id: "templates", size: 72}

所以,据我所知,模板是可用的,但不是在开头。看起来这是一个依赖顺序问题。

角度子模块的module.run()是否在我的应用程序的主入口点之前执行?我感觉注入正确完成,但gm.templates run()方法以某种方式异步完成到我的服务。如何在需要之前强制执行子模块 .run()?

1 个答案:

答案 0 :(得分:1)

如果您想在应用程序运行之前访问模板列表,可以将它们附加到窗口对象。

您可以通过配置grunt / gulp任务来完成此操作。 (在这里喝咖啡)

然后,您将拥有window.gtTemplates对象中的所有模板,并可以在您的服务中使用它们。请注意,$templateCache也将像以前一样填充。

TEMPLATE_HEADER = 'window.gmTemplates = {};'
TEMPLATE_BODY = 'window.gmTemplates["<%= url %>"] = "<%= contents %>";'
TEMPLATE_FOOTER = 'angular.module("<%= module %>").run(["$templateCache", function($templateCache) {
    Object.keys(window.gmTemplates).forEach(function(url) {
        $templateCache.put(url, window.gmTemplates[url])
    })
}]);'

gulp.task 'template', ->
    gulp.src([
        'src/**/*.html'
        '!src/index.html'
    ])
    .pipe(templateCache(
        root: '/'
        module: 'app'
        templateHeader: TEMPLATE_HEADER
        templateBody: TEMPLATE_BODY
        templateFooter: TEMPLATE_FOOTER
    ))
    .pipe(gulp.dest('dist/src/'))