我正在创建一个Ionic应用程序。我有3个提供者 - 数据库提供者,组合提供者和用户提供者。所有3个都是可注射的。我用这种方式创建它是因为其他几个页面需要使用它们的函数调用(即它们不应该共享相同的数据,它们都应该创建新的实例)
组合和用户提供程序都导入数据库提供程序,因为需要进行相同的数据库调用以检索数据。
我有1页 - ViewPortfolio。 ViewPortfolio页面导入用户提供者(以了解用户是谁)和组合提供者(以获取用户组合数据)。出于某种原因,这两个提供者似乎共享数据库提供者的相同实例。这就是我使用它们的方式:
PORTFOLIO PROVIDER
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,它也不会创建唯一的实例。这是为什么?
我认为这可能是因为我在同一页面上导入它们但我不相信这就是为什么它不起作用。如何使2个提供者在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 {}
谢谢,
答案 0 :(得分:0)
您是否从app.module.ts(root AppModule)中删除了提供程序?
来自Angular文档:
场景:服务隔离
虽然您可以在根AppModule中提供VillainsService(您可以在那里找到HeroesService),但这会使VillainsService在应用程序的任何位置都可用,包括Hero工作流程。
如果您使用ionic-cli生成提供程序,它会自动将其添加到根AppModule。