【问题标题】:ionic async ngFor data离子异步 ngFor 数据
【发布时间】:2019-02-15 20:51:48
【问题描述】:

底部更新

我试图在 *ngFor 中显示我从一个从离子存储异步检索的对象中获取的数据。目前我得到一个空白屏幕。

我尝试了多种方法,例如以不同方式使用异步管道。 有人知道正确的方法吗?

这是我被调用的存储服务方法:

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

这是我的组件代码:

import { Component, OnInit } 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;

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

  ngOnInit(): void {

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

  }

  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++;
    }
  }
}

我的html:

<ion-content padding>
<div *ngIf="(flow | async)">
 <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}}</h2>
            <button ion-button item-end clear icon-end> 
                <ion-icon name='more'></ion-icon>
              </button>
            <p>{{task}}</p>
          </ion-item>
        </ion-card>
   </div>
</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>

感谢您的帮助。

更新:

我在我的组件中发现了一个大错误,它现在看起来像这样:

  flow:Flow;

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

我也更新了我的 html,但它仍然无法正常工作:我现在收到错误:

ERROR TypeError: _co.flow.getTasksFromCol 不是函数 在 Object.eval [作为 updateDirectives]

这很奇怪,因为这个方法存在于我的流模型中:

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;
    }
}

更新2 我现在将此添加到我的服务中

public getTasksFromCol(flowId:number,colNumber:number){
        return this.storage.get(FLOWS_KEY).then((flows:Map<number,Flow>)=>{
           var flow:Flow = flows.get(flowId);
           var tasks = new Array<Task>();
           for(let task of Array.from(flow.tasks.values())){
               if(task.column == colNumber){
                   tasks.push(task)
               }
           }
           return tasks;
        });

    }

我只是在我的 html 页面中调用它吗?我有点卡住了

【问题讨论】:

    标签: asynchronous ionic-framework storage


    【解决方案1】:

    我发现了你的错误。

    您已经创建了一个变量。

    flow:Flow;
    

    您已为该变量赋值。

    this.flow = flow;
    

    现在您需要了解该变量包含一些与您分配的值相关的值。所以你不能访问 flow.getTasksFromCol()

    这就是您遇到此错误的原因。

    ERROR TypeError: _co.flow.getTasksFromCol is not a function at Object.eval [as updateDirectives]

    解决方案:-

    只需将此 getTasksFromCol() 方法移动到服务并应用 html,如下所示,

    我希望它有效。让我们尝试一次,如果有任何错误,请告诉我。

    【讨论】:

    • 你会如何实现这个?让服务检索流程然后获取所需任务?
    • 现在我的存储似乎不再工作了,数据库被删除了,如果我创建了一个流,它就不会进入数据库。发生了一件非常奇怪的事情,哈哈
    • 我将该方法添加到我的服务中。我尝试在我的 html 中调用它,但我的应用程序然后就冻结了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多