【问题标题】:ng.core.Component(...).Class is not a functionng.core.Component(...).Class 不是函数
【发布时间】:2018-06-14 22:55:11
【问题描述】:

我使用的是 Angular 2 的 ES5 风格。因此,我没有使用装饰器,而是定义如下模板:

var someComponent = ng.core.Component({
    // component configuration
}).Class({
    // component class
});

工作正常。最近我升级到 Angular 5,现在我对相同的代码有这些错误:

ng.core.Pipe(...).Class 不是函数
ng.core.Component(...).Class> 不是函数
ng.core.Directive(...).Class 不是函数

我应该如何在 Angular 5 中更改它?

【问题讨论】:

  • 完全不相关,但你能告诉我为什么你选择使用 ES5 而不是 tyescript 吗?
  • @Dhyey,为什么不相关?我们必须使用 ES5 的原因是因为我们在企业架构中使用 Angular,该架构强制执行 Angular 不支持的更多事情。例如,无法在多个 Angular 项目中使用一种 json 配置。

标签: javascript angular ecmascript-5 angular5


【解决方案1】:

JavaScript 目前被认为是二等公民(没有双关语),而 TypeScript 是首选语言,主要是因为专注于 AOT 编译,它仅适用于 TypeScript。

正如here 解释的那样,

不能再以这种格式声明类。

Component({...}).
Class({
  constructor: function() {...}
})

这种格式只适用于 JIT 和 ES5。这种模式不 允许像 Webpack 这样的构建工具来处理和优化代码,这 导致令人望而却步的大捆绑。我们正在删除此 API 因为我们正在努力通过以下方式确保每个人都走上快车道 默认,使用 ES5 无法进入快速路径 DSL。替换是使用TypeScript和@Decorator格式。

@Component({...})
class {
  constructor() {...}
}

this answer 中所述,在普通 ES5 及更高版本中,装饰器的替代方法是使用 annotationsparameters 静态属性对类(以及函数)进行注释。

所以

var SomeComponent = ng.core.Component({...})
.Class({
  constructor: [
    [new ng.core.Inject(Svc)],
    function (svc) {...}
  ],
  foo: function () {...}
});

变成

SomeComponent.annotations = [new ng.core.Component(...)];
SomeComponent.parameters = [
  [new ng.core.Inject(Svc)]
];
function SomeComponent(svc) {...}
SomeComponent.prototype.foo = function () {...};

作为Class 功能的替代品,任何第三方实用程序类库都可用于在 ES5 中引入语法糖和继承来替代函数,例如uberprotoinherits

强烈建议将现有的 Angular JavaScript 应用程序迁移到 TypeScript,后者在 AOT 编译模式下提供卓越的性能和更小的应用程序占用空间,这将是未来版本的默认模式。

【讨论】:

  • 我个人的经验是,Angular 2 在某种程度上让那些在进入它的世界之前就拥有一些基础设施的人感到沮丧,而且它对于现实世界的企业需求一点也不成熟。我已经解释过了here。根据您的其他回答,我认为您可能也同意这一点。
  • @SaeedNamati 我不喜欢团队做出的一些决定,但你列出的大部分观点可能是由于缺乏 Angular 开发经验(除了 Angular 固执己见的事实而且并不适合所有人)。很多基础设施问题都应该通过 Angular CLI 和/或样板代码库来解决。开发人员需要做的就是 fork 一个 starter 并拉取更改以保持项目同步,没有“容易偏离”的问题。
  • 我们不想为每个组件创建一个模块来懒惰地加载模块 - 自 A1 以来,极端模块化是“最佳实践”。 TS 和导入应该解决很多问题和人为错误。您可以在同一个项目中保留多个框架版本。你不能在 A1 中做到这一点。除了 AOT 无法与原始 ES5/ES6 一起使用这一事实之外。 AOT 是有缺陷的,但它允许保持框架性能和足迹与 React 和 Vue (或多或少)相当——这是自 A2 发布以来的一个问题,否则不可能。请注意,React 和 Vue 也都被编译了。
  • @estus, function SomeComponent() {...} 不能用作.Class({...}) 的替代品,因为Class 获取JSON 对象作为参数,当然有构造函数,但@987654339 @definition 将 JavaScript 作为正文。你能指导我举一个真实的例子吗?
  • @mohammadrostamisiahgeli .Class(...) 的 result 是一个函数。 .Class({ constructor: function () {/*init*/ }, foo: ...) 变为 function SomeComponent() {/*init*/}; SomeComponent.prototype.foo = ...; 这并不是 Angular 开发特有的。这是关于如何在 ES5 中完成“类”的。您是否检查过链接答案中的 ES5 和 ES6 示例?我相信它详细描述了这一点。
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 2016-04-07
  • 2017-10-12
相关资源
最近更新 更多