У меня есть кнопка на моей домашней странице, которая должна «выходить из системы», когда пользователь вошел в систему и «Войти», когда пользователь не вошел в систему. Кнопка входа в систему открывает модальный режим. Как только пользователь входит в систему, он отправляет их на другую страницу. Когда пользователь переходит к домашней странице во время входа в систему, кнопка должна теперь сказать «Выход».С Ionic 2 как вы можете изменить кнопку на основе состояния входа через модальный, который отправит вас на другую страницу после входа?
Я пробовал все события жизненного цикла ionView от NavController.
Я думаю, что это могло бы иметь какое-то отношение к созданию переменной с двумя границами, но на данный момент я не уверен, как это сделать для этого случая.
Я также думаю, что может быть какой-то способ испускать данные через NavController или ViewController на домашнюю страницу. Я не уверен, что это жизнеспособное решение, или как это выполнить в это время.
Наконец-то я думаю, что если бы я мог вернуть значение через функцию openModal на главной странице, то пользователь должен войти в систему из модальности входа, который тоже мог бы работать, но снова, я не знаю, как это сделать.
Код для страницы Домашняя страница:
home.ts
import { Component } from '@angular/core';
import { NavController, ModalController } from 'ionic-angular';
import { LoginService } from '../../services/loginService';
import { Login } from '../login/login';
@Component({
selector: 'page-home',
templateUrl: 'home.html',
providers: [LoginService]
})
export class Home {
person: any;
constructor(public navCtrl: NavController, public storage: Storage, public loginService: LoginService, public benefitService: MembershipBenefitService, public modalCtrl: ModalController) {
this.benefit = benefitService.benefit(Parse.User.current());
this.person = Parse.User.current();console.log("this.person", this.person);
}
openModal(): any{
let profileModal = this.modalCtrl.create(Login);
profileModal.present();
}
signout(): any{
this.loginService.logout();
this.person = null;
return this.person
}
home.html
<ion-header class="opaque">
<ion-navbar align-title=”center”>
<br>
<ion-title>
<img src="assets/new-logo-sm.png"/>
</ion-title>
<ion-buttons end>
<button ion-button icon-only *ngIf="person != null" (click)="signout()">
Sign out
</button>
<button ion-button icon-only *ngIf="person == null" (click)="openModal()">
<ion-icon name="help-circle"></ion-icon>
</button>
</ion-buttons>
</ion-navbar>
</ion-header>
Код для Modal:
login.ts
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { Parse } from 'parse-js-sdk';
import { LoginService } from '../../services/loginService';
@Component({
selector: 'login',
templateUrl: 'login.html',
providers: [LoginService]
})
export class Login {
email: string = "";
password: string = "";
person: any;
personEmail: any;
constructor(public navCtrl: NavController, private loginService: LoginService) {
var self = this;
self.person = Parse.User.current()//.get("email");
console.log('self.person', self.person);
if(self.person !== null){
self.personEmail = Parse.User.current().id
}
}
login(){
this.loginService.login(this.email, this.password);
}
}
login.html
<form (ngSubmit)="login()">
<ion-list class="clearbackground">
<ion-item>
<ion-label floating class="input-label">Email Address</ion-label>
<ion-input class="input-label" [(ngModel)]="email" required="required" type="email" maxlength="200" name="email"></ion-input>
</ion-item>
<br>
<ion-item>
<ion-label floating class="input-label">Password</ion-label>
<ion-input [(ngModel)]="password" required="required" type="password" maxlength="200" name="password"></ion-input>
</ion-item>
<br>
</ion-list>
</form>
<ion-list>
<ion-grid>
<ion-row>
<ion-col>
<button class="login-button-two" (click)="login()">Welcome Back</button>
<br>
</ion-col>
</ion-row>
</ion-grid>
</ion-list>
Войти Услуги:
import { Injectable } from '@angular/core';
import { AlertController, NavController, ViewController } from 'ionic-angular';
import { Parse } from 'parse-js-sdk';
import { Directory } from '../pages/directory/directory';
@Injectable()
export class LoginService {
constructor(public navCtrl: NavController, public alertCtrl: AlertController, public viewCtrl: ViewController) {
}
login(email, password) {
var self = this;
if(Parse.User.current() === null) {
return Parse.User.logIn(email, password, {
success: function (logIn1User) {
console.log('3', logIn1User);
if(logIn1User.get("accountCanceled") === true){
Parse.User.logOut();
return self.accountCanceled();
} else {
self.navCtrl.push(Directory);
self.viewCtrl.dismiss();
}
},
error: function (logIn1User, error) {
console.log('4', logIn1User, error);
return self.emailMistake();
}
});
} else {
self.alreadyLoggedInMessage();
}
};
}
Я действительно ценю ваш ответ, и это выглядит, как он должен работать, но это не так. Кроме того, я попробовал несколько вариантов вашего предложения: добавьте loginService.get_user_status() в конструктор ts и set_user_status в службу в функции входа и выхода после переназначения user_status на true или false. Я думаю, что есть проблема с моим вопросом. Он всегда возвращает обещание, и поскольку это библиотека обещаний A +, я не могу получить результат отдельно от объема обещания. – rashadb
Я тестирую код, и он отлично работает. это не зависит от вашего запроса. сначала используйте мое решение без «входа в систему (адрес электронной почты, пароль)», а затем добавьте свою логику. также добавьте loginService в провайдеры src/app/app.module.ts, не входящие в ваш компонент входа. –
Я не понимаю, что вы имеете в виду: «login (email, password)». Кроме того, у меня есть LoginService в моих провайдерах app.module.ts. Учитывая документацию, которую я видел, нам не нужно включать поставщика в компонент, но когда я не включаю его, я получаю «Нет провайдера для NavController!». ошибка. По какой-то причине я заметил, что мне нужно также вводить в компонент. Возможно, я делаю что-то еще неправильно? Хорошо, я думаю, я понимаю непонимание. Я должен знать, успешно ли зарегистрировался пользователь, прежде чем я смогу изменить статус входа, и это обещание. – rashadb