我正在创建一个离子应用。我有3个提供商 - 数据库提供商,投资组合提供商和用户提供商。所有3个都是可注射的。我之所以创建它,是因为其他几个页面需要使用其函数调用(即他们不应共享相同的数据,他们都应该创建新实例)
投资组合和用户提供商导入数据库提供商,因为需要进行相同的数据库来检索数据。
我有1页-VeatportFolio。ViewPortFolio页面导入用户提供商(了解用户是谁)和投资组合提供商(获取用户投资组合数据)。由于某些原因,这两个提供商似乎正在为数据库提供商共享相同的实例。这就是我使用它们的方式:
投资组合提供商
import { DatabaseProvider } from '../providers/database-provider';
@Injectable()
@Component({
providers: [DatabaseProvider]
})
export class PortfolioProvider {
public portfolio_list: any = new BehaviorSubject<Array<string>>([]);
constructor(private dbProvider: DatabaseProvider) {
this.dbProvider.enableDataListener(this.protfolio_path); // set path
this.dbProvider.db_listener.subscribe(value => { // subscribe to data in the path
// do stuff
});
}
}
用户投资组合是相同的,唯一的区别是其听的路径不同。
但是,当我更改投资组合路径中的数据时,订阅呼叫也会在用户路径(反之亦然)中触发。因此,即使我在组件提供商中添加了databaseprovider,但它并没有创建唯一的实例。为什么这是?
我认为这可能是因为我在同一页面上导入它们,但我不相信这就是为什么它不起作用的原因。我如何使两个提供商在databaseprovider上使用独特的实例,同时在同一页面上调用它们?
这是我的app.moudle.ts文件的样子(请注意,我的app.module.ts文件中不包含databaseprovider)
// ... more imports
import { PortfolioProvider } from '../providers/portfolio-provider';
import { UserProvider } from '../providers/user-provider';
@NgModule({
declarations: [
MyApp,
// ... more
],
imports: [
// ... more
IonicModule.forRoot(MyApp, {
backButtonText: '',
tabsPlacement: 'bottom'
}),
IonicStorageModule.forRoot()
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
// ... more
],
providers: [
// ... more
PortfolioProvider,
UserProvider
]
})
export class AppModule {}
谢谢,
您是否从app.module.ts(root AppModule)删除了提供商?
来自角文档:
方案:隔离服务
。
虽然您可以在Root AppModule中提供VillainSservice(这是您找到的Heroesservice的地方),但这将使VillainSservice在应用程序中到处都有,包括Hero Workfrows。
如果您使用离子-CLI生成了提供商,它将它自动将其添加到root AppModule中。