3

我正在创建一个 Ionic 应用程序。我有 3 个提供者——数​​据库提供者、投资组合提供者和用户提供者。所有 3 都是可注射的。我这样创建它是因为其他几个页面需要使用它们的函数调用(即它们不应该共享相同的数据,它们都应该创建新实例)

投资组合和用户提供者都导入数据库提供者,因为需要进行相同的数据库调用来检索数据。

我有 1 页 - ViewPortfolio。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,它也不会创建唯一的实例。为什么是这样?

我认为这可能是因为我将它们都导入到同一页面上,但我不相信这就是它不起作用的原因。如何让 2 个提供程序在 databaseprovider 上使用唯一实例,同时在同一页面上调用它们?

这就是我的 app.moudle.ts 文件的样子(请注意 DatabaseProvider 不包含在我的 app.module.ts 文件中)

// ... 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 {}

谢谢,

4

1 回答 1

0

您是否从 app.module.ts(根 AppModule)中删除了提供程序?

从角度文档:

场景:服务隔离
虽然您可以在根 AppModule 中提供 VillainsService(您可以在其中找到 HeroesService),但这将使 VillainsService 在应用程序的任何地方都可用,包括 Hero 工作流。

如果您使用 ionic-cli 生成提供程序,它会自动将其添加到根 AppModule。

于 2017-11-30T23:33:27.737 回答