Создать уникальный экземпляр провайдера 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.