是否可以在单独的文件中创建树/递归对象,并且如果我从递归类中调用方法,可以使用 Angular CLI 避免Circular dependency detected
警告?
(已在angular 7中进行了测试)我知道这是依赖注入(article)中的问题,但是那些用作外部api或内部api数据的构造函数的对象呢?目的?如果仍然不是一个好主意,您如何解决呢? (我想这个“子问题”的答案是模型的更改,那么我应该如何修改我的模型?)我寻求解决方案,但是the closest question并没有帮助我对情况采用相同的方法。
我有Emails
和Attachments
(带有附件的电子邮件-整个带有附件的Email
也可以是附件,Attachment
是具有属性和内容的分离对象是File
或Email
,但在这里,为简单起见,假设附件始终是一个Email
或null)。
每个类都有用于从JSON对象创建实例的静态方法(我从API获取JSON,然后通过在顶部对象上调用静态fromJson
方法来创建表示API值的对象实例):< / p>
文件:app / model / email.ts(代码的一部分)
import { Attachment } from './attachment';
export class Email {
// some attributes
public attachment?: Attachment;
public static fromJson(js: JSON): Email {
const e = new Email();
// fill some attributes here
if (js['attachment']) { e.attachment = Attachment.fromJson(js['attachment']); }
return e;
}
}
文件:app / model / attachment.ts(部分代码)
import { Email } from './email';
export class Attachment {
// some attributes
public content: Email;
public static fromJson(js: JSON): Attachment {
const a = new Attachment();
// fill some attributes here
if (js['email']) { a.content = Email.fromJson(js['email']); }
return a;
}
}
初始呼叫为:this.email = Email.fromJson(apiResponseForEmail);
这种情况导致在ng build | serve
之后出现检测到循环依赖警告。如果这不是适合您的示例,则可以想象食品的Recipe
类包含Ingredients
,其属性例如数量和温度,其中一个Recipe
的结果是另一个的成分食谱。
如果这些类在一个文件中,则不会报告警告。但是,将所有内容放在一个大文件中并不是我的最佳解决方案(如果还有其他文件)。
这里是Stackblitz with Circular dependency demo(但是在控制台中没有警告,stackblitz显然删除了警告,您需要下载此代码并从localhost运行以查看警告)。
我感兴趣的是,是否可以将此类(在示例中由静态方法在代码递归中调用的类)放置在单独的文件(由类命名的文件)中,并避免检测到循环依赖性消息?
答案 0 :(得分:2)
摆脱循环依赖的一种方法是引入perl grep_fasta.pl input.fasta OGH38127_some_organism
文件:index.ts
index.ts
文件:app / model / attachment.ts(代码的一部分)
export { Attachment } from './attachment';
export { Email } from './email';
文件:app / model / email.ts(代码的一部分)
import * as index_file from './index';
index_file.Attachment {
...
content: index_file.Email;
}
PS:请检查语法,我对语法不确定
答案 1 :(得分:1)
嗨,@ Atiris!
我已经在具有很多循环依赖项的复杂项目中遇到了这个问题( 56条警告)。
经过多次尝试,我认为我没有找到正确的解决方案。
但是我可以告诉你我是如何解决每个警告的。
我将带有警告的每个实现的选择器移到了主文件中。
但这不是很干净。
您尝试仅使用1个文件吗?
您可以创建一个命名空间,在其中添加两个类电子邮件和附件。
这里是Stackblitz without Circular dependency demo
答案:
我是否有可能放置此类课程( 通过静态方法(如示例中)在代码中递归调用 分隔文件(由类命名的文件)并避免循环依赖 检测到消息?
我认为你不能那样做。这是结构性问题。但是我不确定100%。
答案 2 :(得分:1)
我认为我们都有来自编译语言的习惯。在 JS 文件中是模块。我认为这是问题的根源:这些不是类文件而是模块文件。
也许你应该使用其他一些打包工具将你的类文件合并到一个模块中(所以在一个文件中)。
如果您可以将不同的类放在不同的命名空间中,则很可能不会在这些命名空间之间具有相互依赖的类,因此您可以为每个命名空间创建一个模块。然而,相互依赖的类应该属于单个命名空间(=> 相同的模块 => 相同的文件 => 需要额外的工具来打包)
编辑:老问题,但我来到这里时抓了抓头,这是我的两分钱