使用systemJS和文本插件的Angular2 Html视图,'exports.translate'未定义

时间:2016-04-25 16:07:04

标签: typescript angular systemjs

我知道这是一个较旧的讨论,但我在使用angular2与systemjs时遇到了这个问题。我作为meta的唯一东西如下:

System.config({
    'defaultJSExtensions': true,
     baseURL: '/js',
     map: {
         text: '/js/angular2/text.js'
     }
}

我使用文本插件来加载我的html视图并且它们确实正确加载,但是我仍然会在下面提到这个错误,为什么会这样?

“text.js:4未捕获的ReferenceError:未定义导出(匿名函数)”

整个text.js文件非常简单:

(function(System, SystemJS) {(function(require, exports, module, __filename, __dirname, global, GLOBAL) {/*
Text plugin
*/
exports.translate = function(load) {
  return 'module.exports = "' + load.source
    .replace(/(["\\])/g, '\\$1')
    .replace(/[\f]/g, "\\f")
    .replace(/[\b]/g, "\\b")
    .replace(/[\n]/g, "\\n")
    .replace(/[\t]/g, "\\t")
    .replace(/[\r]/g, "\\r")
    .replace(/[\u2028]/g, "\\u2028")
    .replace(/[\u2029]/g, "\\u2029")
  + '";';
}
}).apply(__cjsWrapper.exports, __cjsWrapper.args);
})(System, System);

第4行确实是exports.translate。我找不到text.js指定我没有使用NodeJS的选项,那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您想使用SystemJS API,我会尝试以下方法来注册您的模块:

System.register('mymodule', [ ], function(exports, context) {
  exports.translate = function(load) {
    return 'module.exports = "' + load.source
      .replace(/(["\\])/g, '\\$1')
      .replace(/[\f]/g, "\\f")
      .replace(/[\b]/g, "\\b")
      .replace(/[\n]/g, "\\n")
      .replace(/[\t]/g, "\\t")
      .replace(/[\r]/g, "\\r")
      .replace(/[\u2028]/g, "\\u2028")
      .replace(/[\u2029]/g, "\\u2029")
    + '";';
  };
});

这样您就不需要在text.js中添加map,而是直接使用<script>标记:

<script src="text.js"></script>

然后您可以这样导入您的模块:

import {translate} from 'mymodule';

修改

使用匿名模块:

System.register([ ], function(exports, context) {
  exports.translate = function(load) {
    return 'module.exports = "' + load.source
      .replace(/(["\\])/g, '\\$1')
      .replace(/[\f]/g, "\\f")
      .replace(/[\b]/g, "\\b")
      .replace(/[\n]/g, "\\n")
      .replace(/[\t]/g, "\\t")
      .replace(/[\r]/g, "\\r")
      .replace(/[\u2028]/g, "\\u2028")
      .replace(/[\u2029]/g, "\\u2029")
    + '";';
  };
});

在这种情况下,您可以将模块文件与名称(使用默认扩展名或packages块中的专用条目)链接起来。

答案 1 :(得分:0)

如果text.js的请求是通过浏览器而不是SystemJS发送的,则会发生这种情况。必须通过SystemJS请求并下载。您的开发捆绑应该正确设置以适应这一点。

虽然正如@Thierry Themplier所提到的那样,您可以保留原样并为文件夹创建包配置,以指定默认的.js扩展名和.html或您需要的任何其他扩展程序。在我的情况下,这将是一个维护噩梦,其中包含深层文件夹层次结构以及对源文件所在位置的错误依赖性。