ионный накопитель ngFor - PullRequest
       10

ионный накопитель ngFor

0 голосов
/ 13 февраля 2019

В моем ионном приложении я использую модуль ионного хранения.На странице я использую Ngfor для перебора объектов, хранящихся в БД.Я извлекаю этот объект из своей службы базы данных.

Я получаю сообщение об ошибке flow.getTaskFromCol не является функцией.Я думаю, что это происходит потому, что ngFor работает до загрузки объекта (в данном случае потока).Кто-нибудь знает, как я могу предотвратить это?

Это мой код: Html:

<ion-content padding>

 <div *ngFor="let col of flow.columns;index as i">
    <h2>{{col}}</h2>
   <div *ngFor="let task of flow.getTasksFromCol(i)">
      <ion-card (swipe)="swipe($event,task)">
          <ion-item>
              <h2>{{task.title}}</h2>
            <button ion-button item-end clear icon-end> 
                <ion-icon name='more'></ion-icon>
              </button>
            <p>{{task.description}}</p>
          </ion-item>
        </ion-card>
   </div>
</div>

<ion-fab right bottom>
  <button ion-fab color="light"><ion-icon name="arrow-dropleft"></ion-icon></button>
  <ion-fab-list side="left">
    <button (click)="createTask()" ion-fab><ion-icon name="add-circle"></ion-icon></button>
    <button ion-fab><ion-icon name="create"></ion-icon></button>
  </ion-fab-list>
</ion-fab>
</ion-content>

Компонент:

import { Component } from '@angular/core';
import { ModalController } from 'ionic-angular';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Flow } from '../../model/Flow';
import { FlowService } from '../../model/services/flowService';
import {CreateTaskPage} from '../create-task/create-task'
import { Task } from '../../model/Task';

@IonicPage()
@Component({
  selector: 'page-flow',
  templateUrl: 'flow.html',
})
export class FlowPage {
  flow:Flow;

  constructor(public navCtrl: NavController, public navParams: NavParams,private flowService:FlowService,public modalCtrl: ModalController) {
    flowService.getFlows().then((flows:Map<number,Flow>)=>{
      this.flow = flows.get(Number(navParams.get("flowId")))
      console.log(this.flow)
    })

  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad FlowPage');

  }
  ionViewWillLoad(){

  }
  createTask(){
    const modal = this.modalCtrl.create(CreateTaskPage,{flowId:this.flow.flowId});
    modal.present();
  }
  swipe(e,task:Task){
    if(e.direction == 2){
      console.log("panUp");
      task.column--;
    }
    if(e.direction == 4){
      console.log("panDown");
      task.column++;
    }
  }

Служба БД (упрощенный, есть еще методы, но они в настоящее время не вызываются):

import { Flow } from "../Flow";
import { Task } from "../Task";
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
const FLOWS_KEY = 'flowsKey'
@Injectable()
export class FlowService {

    constructor(private storage: Storage){

    }

      getFlows(){
          return this.storage.get(FLOWS_KEY);
      }

} 

Это модель потока:

import { Task } from "./Task";

export class Flow {
    //PK for 1-n relation with task
    flowId:number;
    projectName:string;
    columns:string[];
    tasks: Map<number,Task>;

   constructor(flowId:number,projectName:string,columns:string[],tasks:Map<number,Task>){
    this.flowId = flowId;
    this.projectName = projectName;
    this.columns = columns;
    this.tasks = tasks;
   }

   public getTasks(){
    return Array.from(this.tasks.values())
}
    public getTasksFromCol(colNumber:number){
        var tasks = new Array<Task>();
        for(let task of Array.from(this.tasks.values())){
            if(task.column == colNumber){
                tasks.push(task)
            }
        }
        return tasks;
    }
}

Я обнаружил проблему.я возвращал обещание.Это меняет способ работы вещей.Чтобы решить мою проблему, я изменил мой Сервис и мой компонент.В моем сервисе я добавил этот метод:

 public getFlow(flowId:number){
       return this.storage.get(FLOWS_KEY).then((flows:Map<number,Flow>)=>{
           return flows.get(flowId);
       });
    }

мой компонент теперь выглядит так:

export class FlowPage {
  flow;

  constructor(public navCtrl: NavController, public navParams: NavParams,private flowService:FlowService,public modalCtrl: ModalController) {
    this.flow = this.flowService.getFlow(Number(this.navParams.get("flowId")))
  }
}

Теперь у меня проблема с отображением данных на экране.Это то, что я придумал для HTML.

<ion-content padding>

 <div *ngFor="let col of flow.columns | async;index as i">
    <h2>{{(col | async)?.value}}</h2>
   <div *ngFor="let task of flow.getTasksFromCol(i) | async">
      <ion-card (swipe)="swipe($event,task)">
          <ion-item>
              <h2>{{(task | async)?.title}}</h2>
            <button ion-button item-end clear icon-end> 
                <ion-icon name='more'></ion-icon>
              </button>
            <p>{{(task | async)?.description}}</p>
          </ion-item>
        </ion-card>
   </div>
</div>

<ion-fab right bottom>
  <button ion-fab color="light"><ion-icon name="arrow-dropleft"></ion-icon></button>
  <ion-fab-list side="left">
    <button (click)="createTask()" ion-fab><ion-icon name="add-circle"></ion-icon></button>
    <button ion-fab><ion-icon name="create"></ion-icon></button>
  </ion-fab-list>
</ion-fab>
</ion-content>
...