如何在我的Angular指令Bower包中使用单独的模板?

5
所以我有一组大量的指令,我想在许多项目中使用它,所以我将其转化为一个 bower 包,并将其包含在我的一个项目中。不幸的是,指令无法工作,因为 templateUrl 路径不正确。
templateUrl 基于模板与指令的 js 文件在同一目录下。例如 "./tabbedtextareas.html"。那么解决这个问题的简单方法有哪些呢?
我考虑到的方法有:
  • 将 html 复制并粘贴到 js 文件中
    • 之后编辑模板会很麻烦
  • 使用 grunt 编译带有 JS 的模板,甚至创建一个钩子以提交、合并到主分支并推送。
    • 这是一个非常简单的插件,我更喜欢保持尽可能简单。
  • 将我的模板放在目录中,然后在每个项目中,让我的服务器处理对该文件夹的请求。
    • 任何使用 bower 依赖项的人都需要知道这个特定的事情。也就是说,该包不能简单地通过 bower install 安装。
请注意:是否可以添加一个 bower 安装脚本等?感谢您的帮助。

使用grunt-usemin更新路径怎么样? - Eliran Malka
基本上就是第二种方法。我需要在我的分发文件中添加一个额外的文件夹,然后每次在推送之前都要记得运行grunt。或者使用nodemon并处理每次保存时编译可能出现的延迟。它能用,但不是非常理想。 - Sophie McCarrell
我现在正在执行选项3,直到我找到更好的答案。 - Sophie McCarrell
我认为你在推送之前肯定会运行Grunt(你想运行jshint等,不是吗?) - Eliran Malka
你知道我做什么吗?我用vim编程,然后运行git commit,再运行git push。我不改变我的grunt配置,也不运行grunt test任务,然后是一个publish任务,然后要重新检查演示是否正常工作,然后再推送。我保持事情简单。如果我的项目涉及browserify,我会使用Grunt,然后考虑所有Grunt的其他可能性...但否则我还没有这个需求。简洁是一切的关键。 - Sophie McCarrell
我认为你可以将HTML模板保存到指令中。 - Tyler.z.yang
2个回答

5

我一直在寻找关于这个问题的指导和建议,并考虑了许多不同的选择。我想分享一下我目前所采用的方法。

请注意: 这种方法正在使用的项目仍处于早期阶段,因此所描述的方法绝不是铁板钉钉的。如果将来需要,我不会感到惊讶如果我必须进行调整/更改。

背景环境相同,我们有多个独立的指令存在于GitHub上,通过bower使用。每个组件的模板必须与指令内联,因为templateUrl路径无法工作。

本质上,我正在执行上面第2种选项,使用gulp,并利用gulp-angular-templatecache插件使用angular模板缓存。

解决方案

gulpfile.js

做两件事情,解析组件名称并将模板内容写入模板缓存(通过gulp插件),将组件代码和标记连接成单个文件(到dist/<component-name>.js中)。

var gulp = require('gulp'),
    templates = require('gulp-angular-templatecache'),
    concat = require('gulp-concat'),
    clean = require('gulp-clean'),
    pkg = require('./package.json');

var template = 'myTemplate.tpl.html'

gulp.task('templates', function () {
  return gulp.src(template)
    .pipe(templates('templates.tmp', {
      root: '/templates/',
      module: pkg.name
    }))
    .pipe(gulp.dest('.'));
});

gulp.task('concat', ['templates'], function () {
  return gulp.src([pkg.main, 'templates.tmp'])
    .pipe(concat(pkg.name + '.js'))
    .pipe(gulp.dest('./dist/'));
});

gulp.task('clean', ['concat'], function () {
  gulp.src('./*.tmp', {read: false})
    .pipe(clean());
});

gulp.task('watch', function () {
  gulp.watch(['*.js', '*.html'], ['build']);
});

gulp.task('build', ['templates', 'concat', 'clean']);
gulp.task('default', ['build', 'watch']);

输出

模板被设置在模板缓存中,指令通过 $templateCache.get(key) 获取它并将其设置为 template 属性。这样就可以通过 bower 使用此组件所需的单个文件输出,同时允许您将标记保留在源文件中的分离文件中。

angular.module('myModule', []).directive('myDirective', function ($templateCache) {

  return {
    template: $templateCache.get('/template/myTemplate.tpl.html');
    link: function (scope, elm, attr) {

    }
  };
});

angular.module("myModule").run(["$templateCache", function($templateCache) {$templateCache.put("/template/myTemplate.tpl.html","<div>This is the template for your component</div>");}]);

思考

  1. 在组件开发过程中,有一个额外的构建步骤开销。鉴于要求,我认为没有完全避免这样的步骤的方法。如果不是在组件构建时完成,则必须在实现时完成。在这两个选项中,我认为在组件中进行构建更好,因为范围更窄、更清晰。

  2. 我并不确定我的 gulp 任务完全优化了。有一定数量的同步性,与 "gulp 方式" 相违背。可能需要一些时间/精力来改进它。


写得很好。谢谢你。我已经有一段时间没有在这个项目上工作了,但我可能会在几周内加强它,所以我会在那时回来并让你知道情况如何。非常感谢你的回答 :) - Sophie McCarrell

2

我使用了grunt-angular-templates这个Grunt构建任务,将你的AngularJS模板合并并在$templateCache中注册。

// within my Gruntfile.js
grunt.initConfig({
  ngtemplates: {
    'angular-my-directives': {
      src:      'views/**/*.html',
      dest:     'template.js'
    }
  }
  // ...
});

生成类似于:./template.js 的内容。
angular.module('angular-my-directives').run(['$templateCache', function($templateCache) {

  $templateCache.put('views/directives/my-download.html',
    "<form name=\"myDownloadForm\" ng-submit=\"submit()\" novalidate>\n" +
    "</form>"
  );

}]);

现在,在我的指令中,我可以简单地使用templateUrl: 'views/directives/my-download.html',它将使用$templateCache。
最后,我使用grunt-contrib-concat来合并我的文件以便于加载。

我在这里回答了一个类似的问题,并提供了基本相同的答案:http://stackoverflow.com/a/34427288/2682499 - RuntimeBlairror

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接