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

Я создаю ионное приложение. У меня есть 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 {}

Спасибо,


person AppFirl    schedule 30.11.2017    source источник
comment
Пожалуйста, покажите нам свой app.module.ts   -  person JoeriShoeby    schedule 01.12.2017
comment
@JoeriShoeby Я добавил свой код app.module.ts, отражающий наиболее важные части. Любая идея? Спасибо   -  person AppFirl    schedule 01.12.2017


Ответы (1)


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

Из документации Angular:

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

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

person Adolfo    schedule 30.11.2017
comment
Привет, спасибо за помощь. Я только что попробовал это и теперь получаю следующую ошибку: Ошибка: нет поставщика для DatabaseProvider! Я удалил его из AppModule и добавил через поставщиков @Component, но там говорится, что провайдера нет. Есть идеи, почему? - person AppFirl; 01.12.2017
comment
Я считаю, что вам нужно реализовать отложенную загрузку для своих провайдеров. Взгляните на это: angular.io/guide/ngmodule#lazy-loaded- ngmodule-провайдеры - person Adolfo; 01.12.2017