Создать уникальный экземпляр провайдера ionic 3

Я создаю приложение Ionic. У меня есть 3 поставщика - поставщик базы данных, поставщик портфеля и пользовательский поставщик. Все 3 являются инъекционными. Я создал это таким образом, потому что несколько других страниц должны использовать свои вызовы функций (то есть они не должны совместно использовать одни и те же данные, они все должны создавать новые экземпляры)

И портфель, и пользовательский поставщик импортируют провайдера базы данных, поскольку для извлечения данных необходимо выполнить одни и те же вызовы базы данных.

У меня есть 1 страница - ViewPortfolio. Страница ViewPortfolio импортирует провайдера пользователей (чтобы узнать, кто пользователь) и провайдера портфеля (чтобы получить данные о портфеле пользователей). По некоторым причинам, эти 2 поставщика, кажется, совместно используют один и тот же экземпляр для поставщика базы данных. Вот как я их использую:

ПОРТФОЛИО ПРОВАЙДЕР

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 в поставщики компонентов, он не создает уникальные экземпляры. Почему это?

Я подумал, что это может быть потому, что я импортирую их оба на одной странице, но я не уверен, что это не работает. Как я могу заставить двух провайдеров использовать уникальные экземпляры на базе данных, одновременно вызывая их на одной странице?

Вот так выглядит мой файл 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 {}

Спасибо,

1 ответ

Вы удалили провайдера из app.module.ts (корневой AppModule)?

Из угловой документации:

Сценарий: изоляция сервиса
Хотя вы можете предоставить VillainsService в корневом модуле AppModule (там вы найдете HeroesService), это сделает VillainsService доступным везде в приложении, включая рабочие процессы Hero.

Если вы сгенерировали провайдера с помощью ionic-cli, он автоматически добавит его в корневой AppModule.

Другие вопросы по тегам