我正在尝试创建一个微调器,当单击按钮但它似乎没有运行时,这就是我在component.html中所做的
<button type="submit" class="btn btn-accent btn-block btn-flat b-r-10" style="background: #FF473A;">
Sign In
<i class="fa fa-spinner fa-spin" *ngIf="loading"></i>
</button>
并在component.ts中
export class LoginComponent implements onInit {
private loading: boolean;
//form ngSubmit function()
login() {
if (this.user.email, this.user.password) {
this.loading = true;
this.userSrv.login(this.user.email, this.user.password); //api call here
this.loading = false;
}
}
}
好的我的服务。
import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import { Router } from '@angular/router';
import { Globals } from '../shared/api';
import 'rxjs/add/operator/toPromise';
import { Observable } from 'rxjs/Observable';
@Injectable() 导出类UserService {
private loginUrl = this.globals.LOGIN_URL;
private loggedIn = false;
public loading: boolean = false;
constructor(private http: Http, private router: Router, private globals: Globals) { }
login(email: string, password: string) {
let headers = new Headers();
this.loading = true;
headers.append('Content-Type', 'application/json');
return this.http.post(this.loginUrl, JSON.stringify({ email, password }), { headers })
.subscribe(res => {
let data = res.json();
if (data.token) {
this.loading = false;
window.location.href = '/';
}
else {
this.loading = false;
this.router.navigateByUrl('/login');
}
}, error => {
this.loading = false;
})
};
这是我希望点击时实现的目标
答案 0 :(得分:1)
首先在component.html中
<button type="submit" class="btn btn-accent btn-block btn-flat b-r-10" (click)="login()" style="background: #FF473A;">
Sign In
<i class="fa fa-spinner fa-spin" *ngIf="loading"></i>
</button>
现在您可以将this.loading=false;
添加到订阅者中:
export class LoginComponent implements onInit {
private loading: boolean;
//form ngSubmit function()
login() {
if (this.user.email, this.user.password) {
this.loading = true;
this.userSrv.login(this.user.email, this.user.password)
.subscribe((res: any) => {
this.loader = false;
//check your condition here and redirect to
},
(error) => {
this.loader = false;
});
}
}
}
在您的service.ts文件中:
login(email: string, password: string) {
return this.http.post(this.loginUrl, JSON.stringify({
email, password
}));
};
希望这会对你有帮助!
答案 1 :(得分:0)
HttpModule
已被弃用您必须使用新的HttpClientModule
whcih默认格式化对JSON的响应,因此我们不再需要使用response.json()
解析它:
修改后的服务代码:从您的服务返回Observable
并在您的组件中订阅
import { Injectable } from '@angular/core';
import { HttpHeaders,HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import { Globals } from '../shared/api';
import { Observable } from 'rxjs/Observable';
private loginUrl = this.globals.LOGIN_URL;
private loggedIn = false;
public loading: boolean = false;
constructor(private http: HttpClient, private globals: Globals) { }
login(email: string, password: string):Observable<any> {
const headers = new HttpHeaders({'Content-Type':'application/json;})
return this.http.post(this.loginUrl, JSON.stringify({ email, password }), { headers });
}
修订组件:
将逻辑放入susbscribe回调中,以确保只有在您的请求得到解决后微调器才会关闭。
export class LoginComponent implements onInit {
constructor(private router:Router){}
public loading: boolean;
//form ngSubmit function()
login() {
if (this.user.email, this.user.password) {
this.loading = true;
this.userSrv.login(this.user.email, this.user.password).subscribe(res
=> {
let data = res;
if (data.token) {
this.loading = false;
window.location.href = '/';
}
else {
this.loading = false;
this.router.navigateByUrl('/login');
}
}, error => {
this.loading = false;
});
}}
修订HTML
<button type="submit" class="btn btn-accent btn-block btn-flat b-r-10" (click)="login()" style="background: #FF473A;">
Sign In
<i class="fa fa-spinner fa-spin" *ngIf="loading"></i>
</button>
答案 2 :(得分:0)
ng-if 无论出于何种原因都不适合我。另一种解决方案是:
<button-spinner id="btn1">
$scope.$broadcast('btnSpinnerSuccess', 'btn1');
第 3 步进入点击 btn1 时调用的方法