Ctf*_*cia 5 ionic-framework angular
tl; dr:向下滚动到解决方案
我有一个循环依赖项,并且正在收到警告,这是正确的,但是,我正在对其进行管理。问题是我有一个聊天组件。在角落,您可以选择查看他们的个人资料页面,而在他们的个人资料页面中,您可以选择向他们发送消息,因此是循环依赖性。我正在通过管理
public async openProfile(): Promise<void> {
this.modalCtrl.dismiss(); //closing the chat component before opening the profile modal
const profile = await this.modalCtrl.create({
component: ProfileComponent,
});
await profile.present();
}
Run Code Online (Sandbox Code Playgroud)
public async openChat(): Promise<void> {
this.modalCtrl.dismiss(); //closing the profile component before opening the chat modal
const chat = await this.modalCtrl.create({
component: ProfileComponent,
});
await chat.present();
}
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来处理这种循环依赖关系?
更新:根据下面的建议,我尝试创建服务。但是现在我有了一个三向依赖圈:
private modalService: ModalService;
constructor(modalService: ModalService){
this.modalService = modalService
}
public async openProfile(): Promise<void> {
this.modalService.openProfile(this.userData);
}
Run Code Online (Sandbox Code Playgroud)
private modalService: ModalService;
constructor(modalService: ModalService){
this.modalService = modalService
}
public async openChat(): Promise<void> {
this.modalService.openChat(this.userData);
}
Run Code Online (Sandbox Code Playgroud)
import { ModalController } from '@ionic/angular';
import { Injectable } from '@angular/core';
import { ProfileComponent } from '../../components/profile/profile.component';
import { ChatComponent } from '../../components/chat/chat.component';
import { UserData } from '../../interfaces/UserData/userData.interface';
@Injectable({
providedIn: 'root',
})
export class ModalService {
private modal: ModalController;
public constructor(modal: ModalController) {
this.modal = modal;
}
public async openProfileComponent(user: UserData): Promise<void> {
this.modal.dismiss();
const profile = await this.modal.create({
component: ProfileComponent,
componentProps: {
contact: user,
},
});
await profile.present();
}
public async openChatComponent(user: UserData): Promise<void> {
this.modal.dismiss();
const chat = await this.modal.create({
component: ChatComponent,
componentProps: {
contact: user,
},
});
await chat.present();
}
public close(): void {
this.modal.dismiss();
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE Stackblitz对于Ionic 4来说太不稳定了,因此我无法在上面复制它,因此这里是信息和相关代码的要点。
UPDATE2
我接受了答案中提到的建议,但仍然收到错误。为了做到这一点,我创建了一个shared.module.ts看起来像这样的:
import { UserService } from './componentServices/user/user.service';
import { ModalService } from './componentServices/modal/modal.service';
import { AuthenticationSecurityService } from './componentServices/auth_security/authentication-security.service';
import { AuthGuardService } from '../_guards/auth-guard.service';
import { ApiService } from './componentServices/api/api.service';
import { ChatService } from './components/chat/socketIO/chat.service';
@NgModule({
imports: [CommonModule, ReactiveFormsModule, IonicModule.forRoot(), FormsModule, IonicModule],
declarations: [
// various components
],
exports: [
// various components and common modules
],
})
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [
UserService,
ModalService,
DashboardService,
AuthenticationSecurityService,
AuthGuardService,
ApiService,
ChatService,
],
};
}
}
Run Code Online (Sandbox Code Playgroud)
imports: [
SharedModule.forRoot(),
]
Run Code Online (Sandbox Code Playgroud)
client:135 Circular dependency detected:
src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts
client:135 Circular dependency detected:
src/sharedModules/components/chat/chat.component.ts -> src/sharedModules/components/search/search.component.ts -> src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/chat/chat.component.ts
client:135 Circular dependency detected:
src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/profile/profile.component.ts
client:135 Circular dependency detected:
src/sharedModules/components/search/search.component.ts -> src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/chat/chat.component.ts -> src/sharedModules/components/search/search.component.ts
Run Code Online (Sandbox Code Playgroud)
正如@ bryan60和@Luis所说,必须有一个缓冲区,所以我所做的就是遵循他们俩都建议的发射路线。Bryan给出了更多代码,其中Luis给出了重要的职责摘要。这是我重构的方式:
imports: [
SharedModule.forRoot(),
]
Run Code Online (Sandbox Code Playgroud)
client:135 Circular dependency detected:
src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts
client:135 Circular dependency detected:
src/sharedModules/components/chat/chat.component.ts -> src/sharedModules/components/search/search.component.ts -> src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/chat/chat.component.ts
client:135 Circular dependency detected:
src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/profile/profile.component.ts
client:135 Circular dependency detected:
src/sharedModules/components/search/search.component.ts -> src/sharedModules/components/profile/profile.component.ts -> src/sharedModules/componentServices/modal/modal.service.ts -> src/sharedModules/components/chat/chat.component.ts -> src/sharedModules/components/search/search.component.ts
Run Code Online (Sandbox Code Playgroud)
public initializeApp(): void {
this.platform.ready().then((): void => {
this.statusBar.styleDefault();
this.splashScreen.hide();
this._subToObservables();
});
}
private _subToObservables(): void {
this.modalService.openModal$.subscribe(
async (e: ModalEmitInterface): Promise<void> => {
const { command, data } = e;
switch (command) {
case 'open-profile':
const profile = await this.modalCtrl.create({
component: ProfileComponent,
componentProps: {
contact: data,
},
});
await profile.present();
break;
case 'open-chat':
// same as above
break;
default:
break;
}
},
);
}
Run Code Online (Sandbox Code Playgroud)
chat.component.ts
export class ModalService {
private openModalSubject: Subject<ModalEmitInterface> = new Subject<ModalEmitInterface>();
public readonly openModal$: Observable<ModalEmitInterface> = this.openModalSubject.asObservable();
private emitPayload: ModalEmitInterface;
public openProfileComponent(user: UserData): void {
this.emitPayload = {
command: 'open-profile',
data: user,
};
this.openModalSubject.next(this.emitPayload);
}
// repeat for others
}
Run Code Online (Sandbox Code Playgroud)
就是这样,尽管您仍然需要确保要关闭模式,否则它们将继续堆叠。
小智 3
遇到过几次这种情况。我每次都会得到相同的解决方案,并且它对我来说扩展得很好,所以就这样了。
您将需要一项服务(正如其他人所建议的那样),但也需要一个,我们称之为公正的玩家。这个想法是使用服务作为两个相互依赖的组件之间的通信/消息传递缓冲区,以帮助打破交叉引用。为了举例,我们假设“App.Component”。
组成部分和职责:
Modal.Service:接收消息以执行操作。它可以通过单个方法接收指示操作的字符串或对象,也可以通过每个操作的多个方法。实施细节由您决定。
App.Component:获取注入的 ModalService 并订阅消息事件。根据操作消息,然后激活相应的模式。
Chat.Component:获取注入的 Modal.Service 并发送一条消息,指示要执行的操作,即显示配置文件。
Profile.Component:获取注入的 Modal.Service 并发送一条消息,指示要执行的操作,即发送消息。
这种扩展性非常好,并且该服务可以用作多个其他模块和/或组件之间的通信缓冲区。
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |