Статьи

Создание приложения Task Manager с использованием Ionic: часть 2

В первой части серии руководств вы создали пользовательский интерфейс и навигацию для приложения диспетчера задач. В этом руководстве вы увидите, как реализовать функциональные возможности приложения Ionic Task Manager для добавления и перечисления задач.

Давайте начнем с клонирования исходного кода из первой части серии руководств.

1
git clone https://github.com/royagasthyan/IonicTaskManager-Part1

Перейдите в каталог проекта и установите необходимые зависимости.

1
2
cd IonicTaskManager-Part1
npm install

Запустите ваше приложение из каталога проекта.

1
ionic serve

Приложение должно быть запущено по адресу http: // localhost: 8100 / .

Вы уже создали компонент Add компонент List для добавления задач и списка задач соответственно. Чтобы они работали синхронно, вам необходимо поддерживать связь между двумя компонентами. Для связи между компонентами вы будете использовать инъекционный CommonService .

Создайте папку с именем service в папке src/pages .

Создайте файл службы с именем common.service.ts и добавьте следующий код:

1
2
3
4
5
6
7
8
9
import { Injectable } from ‘@angular/core’;
 
@Injectable()
export class CommonService {
  
    constructor(){
        this.tasks = []
    }
}

Вы будете отслеживать список задач в общем сервисе, и он будет разделен между компонентами Add и List .

Определите переменную с именем tasks в файле common.service.ts . Вы сохраните свой список tasks в этом массиве tasks .

01
02
03
04
05
06
07
08
09
10
11
12
import { Injectable } from ‘@angular/core’;
 
@Injectable()
export class CommonService {
     
    public tasks:any;
 
    constructor(){
        this.tasks = []
    }
 
}

Создайте папку с именем task внутри папки src/pages . Создайте файл с именем task.model.ts и добавьте следующий код:

1
2
3
4
5
6
7
export class Task{
    constructor(
        public Id: Number,
        public Name: String,
        public IsDone: Boolean
    ) { }
}

Вы будете использовать вышеупомянутый класс Task для создания экземпляра новой задачи.

Когда пользователь нажимает кнопку «Добавить задачу» в компоненте « Add , вы добавляете элементы в переменную tasks в файле common.service.ts . Поэтому создайте метод addTask в файле common.service.ts , который вы будете вызывать из компонента Add .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import { Injectable } from ‘@angular/core’;
import { Task } from ‘../model/task.model’
 
@Injectable()
export class CommonService {
    public tasks:any;
 
    constructor(){
        this.tasks = []
    }
 
    addTask(item){
        this.tasks.push(new Task((new Date()).getTime(),item,false));
    }
}

Чтобы добавить задачу в список задач, вам необходимо импортировать файл common.service.ts внутри компонента AddPage .

1
import { CommonService } from ‘../service/common.service’

Инициализируйте CommonService внутри AddPage конструктора компонента AddPage .

1
2
3
constructor(public viewCtrl: ViewController, private commonService: CommonService) {
 
 }

Внутри компонента AddPage создайте метод add котором вы добавите задачу в список общих tasks службы.

Вот как выглядит метод add в компоненте AddPage :

1
2
3
4
add(){
  this.commonService.addTask(this.item);
  this.dismiss();
}

Как видно из приведенного выше метода, вы addTask метод addTask из общей службы, чтобы добавить задачу в список tasks .

После добавления элемента вы вызвали метод dismiss для отмены всплывающего наложения. Вот как add.component.ts файл add.component.ts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { Component } from ‘@angular/core’;
import { ViewController } from ‘ionic-angular’;
import { CommonService } from ‘../service/common.service’
 
@Component({
  selector: ‘page-add’,
  templateUrl: ‘add.component.html’
})
export class AddPage {
 
 
  public tasks: any = [];
  public item:String;
 
  constructor(public viewCtrl: ViewController, private commonService: CommonService) {
 
  }
 
  dismiss(){
      this.viewCtrl.dismiss();
  }
 
  add(){
    this.commonService.addTask(this.item);
    this.dismiss();
  }
 
}

На странице add.component.html добавьте директиву ngModel к элементу ввода.

1
<ion-input name=»add» [(ngModel)]=»item»></ion-input>

Добавьте событие click к кнопке в add.component.html чтобы вызвать метод add внутри add.component.ts .

1
<button ion-button round (click)=»add()»>Add</button>

Сохраните вышеуказанные изменения и попробуйте перезапустить ионный сервер. Перейдите по URL-адресу браузера по адресу http: // localhost: 8100 , и вы сможете просматривать мобильное приложение в браузере.

Нажмите на значок Добавить, чтобы добавить задачу. Введите название задачи и нажмите кнопку «Добавить». Всплывающее окно должно исчезнуть.

Как только задача будет добавлена ​​в список задач, вам необходимо соответствующим образом обновить представление. Таким образом, чтобы отслеживать задачу при добавлении в список, вам нужно использовать Angular Subject .

Определите тему с именем task_subject в файле common.service.ts .

1
public task_subject = new Subject<String>()

Когда задача добавляется в список tasks , вам нужно активировать тему task_subject чтобы сообщить подписчику, что задача была добавлена.

Измените метод addTask внутри файла common.service.ts включив в него следующий код:

1
this.task_subject.next();

Вот модифицированный метод addTask :

1
2
3
4
addTask(item){
    this.tasks.push(new Task((new Date()).getTime(),item,false));
    this.task_subject.next();
}

Подпишитесь на тему task_subject внутри файла list.component.ts .

1
2
3
4
5
constructor(public modalCtrl: ModalController, public commonService:CommonService) {
   this.commonService.task_subject.subscribe(response => {
        this.tasks = this.commonService.tasks;
    })
}

Каждый раз, когда добавляется новая задача, tasks из commonService назначаются tasks в list.component.html и представление обновляется.

Вот как list.component.ts код list.component.ts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { Component } from ‘@angular/core’;
import { ModalController } from ‘ionic-angular’;
import { AddPage } from ‘../add/add.component’;
import { CommonService } from ‘../service/common.service’
 
@Component({
  selector: ‘page-list’,
  templateUrl: ‘list.component.html’
})
export class ListPage {
 
  public tasks=[];
  constructor(public modalCtrl: ModalController, public commonService:CommonService) {
      
     this.commonService.task_subject.subscribe(response => {
            this.tasks = this.commonService.tasks;
        })
  }
 
  presentAddModal() {
   let addModal = this.modalCtrl.create(AddPage);
   addModal.present();
  }
 
}

Измените list.component.html чтобы list.component.html итерацию по переменной tasks из файла list.component.ts . Вот как это выглядит:

1
2
3
4
5
6
7
8
<ion-list>
 
  <ion-item *ngFor=»let item of tasks»>
    <ion-label>{{item.Name}} </ion-label>
    <ion-checkbox name=»chk»></ion-checkbox>
  </ion-item>
 
</ion-list>

Сохраните вышеуказанные изменения и перезагрузите сервер. Попробуйте добавить новое задание, и оно отобразится на экране списка.

Ionic Task Manager

Теперь давайте реализуем функциональность, чтобы отметить законченные задачи. Каждый раз, когда добавляется новая задача, вы добавляете атрибут IsDone как false .

Давайте сохраним два разных массива для отложенных и завершенных задач.

1
2
public pendingTasks = []
public doneTasks = []

Каждый раз, когда добавляется новая задача, вы обновляете два вышеупомянутых массива, как показано:

01
02
03
04
05
06
07
08
09
10
11
constructor(public modalCtrl: ModalController, public commonService:CommonService) {
    
  this.commonService.task_subject.subscribe(response => {
    this.pendingTasks = this.commonService.tasks.filter(item => {
        return item.IsDone == false
    });
    this.doneTasks = this.commonService.tasks.filter(item => {
        return item.IsDone == true
    });
})
}

Когда пользователь нажимает на флажок, вам нужно переключить статус IsDone . Добавьте метод checkPendingItem для переключения статуса IsDone для ожидающих задач.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
checkPendingItem(id){
      
   this.pendingTasks.map((task) => {
     if(task.Id == id){
       if(task.IsDone){
         task.IsDone = false;
       }
       else{
         task.IsDone = true;
       }
     }
   })
 
 
  this.updateTask()
    
 }

Аналогичным образом добавьте еще один метод с именем checkDoneItem чтобы переключать состояние задачи для выполненных элементов. Вот как выглядит метод:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
checkDoneItem(id){
   
  this.doneTasks.map((task) => {
  if(task.Id == id){
    if(task.IsDone){
      task.IsDone = false;
    }
    else{
      task.IsDone = true;
    }
  }
})
 
 
this.updateTask()
   
}

Как IsDone статус IsDone будет переключен, вам нужно обновить задачи. Определите метод с именем updateTask , который вызывается после переключения IsDone в обоих из вышеуказанных методов.

1
2
3
4
5
6
7
8
updateTask(){
  this.pendingTasks = this.commonService.tasks.filter(item => {
    return item.IsDone == false
  });
  this.doneTasks = this.commonService.tasks.filter(item => {
    return item.IsDone == true
  });
}

Измените код list.component.html чтобы отображать pendingTasks и doneTasks отдельно. Вот как выглядит измененный файл list.component.html :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<ion-header>
    <ion-navbar>
        <ion-title text-center>Ionic Task Manager</ion-title>
    </ion-navbar>
 
</ion-header>
 
<ion-content padding>
    <ion-fab top right>
        <button ion-fab mini (click)=»presentAddModal()»><ion-icon name=»add»></ion-icon></button>
    </ion-fab>
 
    <ion-card>
        <ion-card-header>
            My Tasks
        </ion-card-header>
 
        <ion-list>
 
            <ion-item *ngFor=»let item of pendingTasks»>
 
                <ion-label>{{item.Name}} </ion-label>
                <ion-checkbox name=»chk» (click)=»checkPendingItem(item.Id)» [checked]=»item.IsDone»></ion-checkbox>
            </ion-item>
 
        </ion-list>
    </ion-card>
 
    <ion-card>
        <ion-card-header>
            Archived Tasks
        </ion-card-header>
 
        <ion-list>
 
            <ion-item *ngFor=»let item of doneTasks»>
 
                <ion-label color=»light»>{{item.Name}} </ion-label>
                <ion-checkbox name=»chk» (click)=»checkDoneItem(item.Id)» [checked]=»item.IsDone»></ion-checkbox>
 
            </ion-item>
 
        </ion-list>
    </ion-card>
 
</ion-content>

Сохраните вышеуказанные изменения и перезапустите ионный сервер. Приложение должно быть запущено по адресу http: // localhost: 8100 .

Ionic Task Manager App Listing

В этом руководстве вы увидели, как реализовать функциональность для добавления и перечисления задач в мобильном приложении Ionic Task Manager. Вы видели, как использовать службу Angular для обмена данными между двумя компонентами. В этом руководстве вы использовали службу Angular, чтобы хранить данные в общем списке при добавлении из компонента Add и отображать их в компоненте List.

Дайте нам знать ваши мысли в комментариях ниже.

Исходный код из этого урока доступен на GitHub .