GVKun编程网logo

angular – 删除离子3应用程序中提供程序的循环依赖关系

10

本文将带您了解关于angular–删除离子3应用程序中提供程序的循环依赖关系的新内容,另外,我们还将为您提供关于Angular12.ApplicationRef的循环依赖、Angular2变化检测–组

本文将带您了解关于angular – 删除离子3应用程序中提供程序的循环依赖关系的新内容,另外,我们还将为您提供关于Angular 12. ApplicationRef 的循环依赖、Angular 2变化检测 – 组件之间的循环依赖性如何解决?、Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?、angular – 共享混合移动应用程序和桌面Web应用程序的代码的实用信息。

本文目录一览:

angular – 删除离子3应用程序中提供程序的循环依赖关系

angular – 删除离子3应用程序中提供程序的循环依赖关系

我在离子3应用程序的其他提供商中包括提供商.但它给了我错误’找不到供应商’.我做了一些研究,发现它是由于循环依赖.如何克服离子3应用程序中的循环依赖?
Angular不允许引用另一个提供者,因为它可能导致循环依赖注入.我解决它的方法是从构造函数中删除类变量的声明,并使用来自angular core的Injector使用以下代码在超时中注入依赖:

因此,假设您要在提供商B中包含提供商A,

import { ProviderA } from '../provider-a/provider-a';

export class ProviderB {
  provider_a:any;
  constructor(public injector: Injector) {
    console.log('Hello ProviderB Provider');
    setTimeout(() => this.provider_a = injector.get(ProviderA));
  }
}

Angular 12. ApplicationRef 的循环依赖

Angular 12. ApplicationRef 的循环依赖

如何解决Angular 12. ApplicationRef 的循环依赖?

我收到 Error: NG0200: Circular dependency in DI detected for ApplicationRef. 以防万一:

import { ModalController } from ''@ionic/angular'';
import { MyModalComponent } from ''MyModalComponentPath'';

@Injectable({
    providedIn: ''root''
})
export class MyCoreService {
    constructor(
        private modalController: ModalController
    ) { }
    
    private async openModal(): Promise<void> {
        const modal = await this.modalController.create({
            component: MyModalComponent
        });

        modal.present();
    }
}

我也有类似的核心服务使用 ModalController 没有这个错误。

这里的循环依赖怎么可能?有人遇到过这个问题吗?

完整的错误信息:

Error: NG0200: Circular dependency in DI detected for ApplicationRef. Find more at https://angular.io/errors/NG0200
    at throwCyclicDependencyError (core.js:216)
    at R3Injector.hydrate (core.js:11433)
    at R3Injector.get (core.js:11256)
    at injectInjectorOnly (core.js:4751)
    at Module.ɵɵinject (core.js:4755)
    at Object.AngularDelegate_Factory [as factory] (ionic-angular.js:2320)
    at R3Injector.hydrate (core.js:11437)
    at R3Injector.get (core.js:11256)
    at injectInjectorOnly (core.js:4751)
    at Module.ɵɵinject (core.js:4755)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Angular 2变化检测 – 组件之间的循环依赖性如何解决?

Angular 2变化检测 – 组件之间的循环依赖性如何解决?

我已经读过Angular 2变化检测是单向的,从组件树的顶部到底部,并且在单次传递后它变得稳定,这意味着没有多个变化检测周期.鉴于这些假设,在我们有父和子组件具有相互依赖属性的情况下会发生什么?例:

>基于用户事件,父组件更新子组件属性
>此更新将在子组件中触发更新父项属性的事件
>父属性更新将触发另一个更新子组件的事件
> ……

根据我的理解,Angular 1中的类似情况通过设置对这些相互依赖的属性触发的循环次数的限制来解决,这将导致框架抛出错误.

Angular 2如何解决?在上面的例子中,在哪一点上实际触发了变化检测?

I’ve read that Angular 2 change detection… gets stable after a single pass

Angular 2不会“稳定”.使用Angular 2应用程序,我们负责编写应用程序,使其在单次传递后始终保持稳定.

默认情况下(例如,您没有在任何组件上使用OnPush更改检测策略,detach()任何组件也没有使用),更改检测的工作方式如下:

> Zone.js猴子修补的异步事件触发 – 例如,(单击)事件,XHR响应,setTimeout()计时器.与该事件关联的回调运行,这可以更改我们的应用程序中的任何视图或应用程序数据.然后,由于猴子补丁,角度变化检测运行.换句话说,默认情况下(例如,您不是manually triggering change detection),只有猴子修补的异步事件才会触发更改检测.
>从根组件开始,遍历组件树(深度优先遍历),检查每个数据绑定的变化.如果发现更改,则“传播”更改.根据模板绑定类型,传播可以

>将更改的值传播到DOM.例如,当使用{{}}绑定时,新值将传播到相应DOM元素的textContent属性.
>将更改的值传播到子组件.例如,当使用输入属性绑定([childInputProperty] =“parentProperty”)时,新值将传播到子输入属性.

>如果处于开发模式,则会再次检查所有组件,但不会传播.第二次脏检查有助于我们发现代码存在问题,例如,如果我们违反了idempotent rule,这是一种奇特的说法,即我们的一个绑定(其模板表达式)有副作用.换句话说,额外的开发模式检查让我们知道我们的代码在单次传递后是否不稳定.

Angular 2中不允许出现副作用.因此,在引用您的问题时,子组件不得因输入属性传播而修改父属性.所以,你可以说Angular 2通过不允许它来“解决”你所问的情况.

这并不像听起来那么糟糕.我知道输入属性传播可以更改父属性的唯一方法是,子组件为input属性实现setter方法,该方法修改父对象在其模板中显示的另一个属性. (这是执行此操作的old plunker – 请参阅@Input set backdoor()方法.)通常,您不会这样做.如果你确实需要这样做,那么Günter的注释就点了:在setTimeout()中进行更改,因此它将成为下一个更改检测周期的一部分.

我想再强调:事件处理程序在更改检测之前运行,因此他们可以自由地更改我们应用程序中的任何数据 – 本地/组件视图数据,应用程序数据等等.因此,在事件处理程序中,子组件可以自由更改父数据.例如,假设父和子都具有对同一数组的引用.当事件处理程序运行时,父组件和/或子组件可以修改该数组.

因此,如果您在事件处理程序中进行更改,则没有问题.如果你的二传手做了奇怪的事情,那就只有一个问题.

Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?

Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?

在Angular 5中,如果我使用AbstractClassService和ExtendedClassService来扩展抽象,我可以在我的NgModule的providers数组中执行此操作:
@NgModule({
  providers: [
    {provide: AbstractClassService,useClass: ExtendedClassService}
  ]
})
export class AppModule {}

这将允许我将ExtendedClassService与另一个进行切换以进行测试或非常容易.这仍然可以使用Angular 6完成,但是有一个新的providedIn选项可以在服务本身中设置以减少包大小:

@Injectable({providedIn: 'root'})
export class ExtendedClassService extends AbstractClassService {}

有没有办法让我在使用新的provideIn时完成与Angular 5相同的操作?像这样的东西:

@Injectable({providedIn: 'root',provide: AbstractClassService})
export class ExtendedClassService extends AbstractClassService {}
我需要做两件事.

首先,在创建继承类时使用implements而不是extends,并且不要在那里使用providedIn键:

@Injectable() // removed providedIn
export class ExtendedClassService implements AbstractClassService {}

其次,将提供者指令添加到抽象类中:

@Injectable({providedIn: 'root',useClass: ExtendedClassService})
export abstract class AbstractClassService {}

其他提供程序配置(useValue,useExisting,useFactory)也可以在那里使用.

凭借this comment获得Abinesh的信用,这使我获得了the linked blog post.非常感谢博客作者!

angular – 共享混合移动应用程序和桌面Web应用程序的代码

angular – 共享混合移动应用程序和桌面Web应用程序的代码

我想构建一个全新的应用程序,应该作为混合移动应用程序和桌面Web应用程序进行部署.

大多数情况下,两个应用程序的逻辑和用户界面非常相似.
除了一些差异:

>移动设备的屏幕尺寸优化(例如,移动设备中隐藏的侧面菜
>移动中的触摸手势(3DTouch)与桌面中的悬停功能
>触摸移动设备中某些元素的反馈
>移动中的页面导航与桌面中的路由导航

我想过将angular-material组件用于桌面,将Ionic组件和移动导航用于两者都建立在角度之上.

当然,我的目标是尽可能多地共享代码,逻辑以及UI容器组件.

因此,我尝试在为桌面UI,移动UI,共享UI和逻辑创建单独的Angular模块时考虑构建项目的好方法:

一种选择是为两个应用程序提供一个核心模块,导入逻辑和共享UI模块.然后在为每个平台构建时在特定平台UI模块之间切换.在此选项中,特定于平台的UI组件将具有相同的选择器和@Inputs,但在其呈现的UI中会有所不同.

第二个选项是为每个将导入逻辑模块和共享UI组件模块的平台应用程序提供单独的核心模块.

也许有人有这样做的经验,可以分享他对涵盖所有这些的最佳项目结构的看法?

或者我建议哪个项目结构更好?

解决方法

根据我的经验,有效的是以下内容

>使用单独的文件结构创建2个单独的“前端”项目
在单独的目录中,使用特定的“命令行工具”
框架(Angular CLI,Ionic CLI,NativeScript CLI).
>创建一个包含要共享的公共模块的公共项目
通过’前端’项目
>从代码库导入共享模块到’前端
结束’项目(例如在名为’shared’的目录下) – 确保
您将前端项目与相同的通用版本保持一致
‘共享’项目

真正的技巧是设置“共享”模块的边界,以便在不增加代码复杂性的情况下最大化重用(例如,通过在’共享’代码中检查环境 – 我避免使用环境变量来定义是否代码以Ionic或Angular运行,并根据该变量做出决定.

对我来说,经验法则是“前端”项目定义所有组件(即组件不共享).

组件具有非常浅的逻辑,通常类似于以下内容

>他们在构造函数中定义他们使用的服务
>在ngOnInit()方法中,他们订阅了Observables
服务方法返回的兴趣 – 订阅逻辑
填充包含视图中显示的数据的变量
>在ngOnDestroy()中,他们取消订阅订阅
>组件定义管理前端事件的方法 – 例如
方法通常在共享服务上调用方法

编码时会出现正确的设计.我的意思是,一旦你建立了基本结构(即’前端’项目和’共享’项目),你开始编码一个前端(例如浏览器的Angular).一些决策很容易采取(例如,查询后端的所有逻辑通常都是共享的).其他一些决定更棘手,而且越接近前端表面的逻辑越真实.一旦你看到组件中的逻辑变得越来越厚,那么你就开始想知道是否有值得分享的东西,因为对于另一个’前端’也许是常见的(让我们说Ionic).如果是这种情况,那么您重构,将代码移动到“共享”服务.

还要记住通过测试充分保护“共享”服务.

我希望它有所帮助

今天关于angular – 删除离子3应用程序中提供程序的循环依赖关系的介绍到此结束,谢谢您的阅读,有关Angular 12. ApplicationRef 的循环依赖、Angular 2变化检测 – 组件之间的循环依赖性如何解决?、Angular 6提供了 – 如何自定义@Injectable()提供程序以进行依赖注入?、angular – 共享混合移动应用程序和桌面Web应用程序的代码等更多相关知识的信息可以在本站进行查询。

本文标签: