Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用*ngIf会导致HTTP请求的无限循环 密码或用户名错误_Javascript_Angular_Typescript_Xmlhttprequest - Fatal编程技术网

Javascript 使用*ngIf会导致HTTP请求的无限循环 密码或用户名错误

Javascript 使用*ngIf会导致HTTP请求的无限循环 密码或用户名错误,javascript,angular,typescript,xmlhttprequest,Javascript,Angular,Typescript,Xmlhttprequest,一切都可以正确编译,但当我刚刚启动应用程序时,一个无限循环将通过向控制台发送数百条access denied日志开始。这是难以置信的在屏幕上可见 为什么会这样?单击login按钮时,将调用login函数。我不必单击它来启动无限循环。当应用程序出现在浏览器中时,就会发生这种情况。ngIf语句定期检查登录方法的状态返回值:这就是登录方法实际被调用n次的原因。不要将ngIf绑定到login方法的返回值,而是将语句绑定到一个由login方法更改的布尔变量:这将防止触发该方法,并且观察者将对变量状态进行操

一切都可以正确编译,但当我刚刚启动应用程序时,一个无限循环将通过向控制台发送数百条
access denied
日志开始。这是难以置信的<代码>在屏幕上可见


为什么会这样?单击
login
按钮时,将调用login函数。我不必单击它来启动无限循环。当应用程序出现在浏览器中时,就会发生这种情况。

ngIf语句定期检查登录方法的状态返回值:这就是登录方法实际被调用n次的原因。不要将ngIf绑定到login方法的返回值,而是将语句绑定到一个由login方法更改的布尔变量:这将防止触发该方法,并且观察者将对变量状态进行操作。例如,在控制器中

<p *ngIf="!login()">Wrong password or username</p>
在模板中:

public authError: boolean = false;

private _login() {
    this.http.get(`http://localhost/api/token/${id}`)
        .map(res => res.json())
        .subscribe(res => {
            this.response = res;
            if (this.response) {
                this.router.navigate(['/']);
            } else {
                console.log('access denied');
                // In case of error, set the auth error property to true
                this.authError = true;
                return false;
            }
        });
    }
密码或用户名错误


请注意,我更改了登录方法的名称:私有方法应按约定以下划线开头。

ngIf语句定期检查登录方法的状态返回值:这就是登录方法实际被调用n次的原因。不要将ngIf绑定到login方法的返回值,而是将语句绑定到一个由login方法更改的布尔变量:这将防止触发该方法,并且观察者将对变量状态进行操作。例如,在控制器中

<p *ngIf="!login()">Wrong password or username</p>
在模板中:

public authError: boolean = false;

private _login() {
    this.http.get(`http://localhost/api/token/${id}`)
        .map(res => res.json())
        .subscribe(res => {
            this.response = res;
            if (this.response) {
                this.router.navigate(['/']);
            } else {
                console.log('access denied');
                // In case of error, set the auth error property to true
                this.authError = true;
                return false;
            }
        });
    }
密码或用户名错误


请注意,我更改了登录方法的名称:私有方法应按约定以下划线开头。

可能
*ngIf
位于
*ngFor
循环中?@5313M我不这样认为,请再显示一些代码。您没有提到要从哪个组件调用login。显示您的console.log(res);您的路由文件。当您不返回true或false时,您正在调用一个函数,它可能返回null或false,所以!会把它变成现实。为什么难以置信?Angular必须不断调用该方法,以确定它是否仍应显示关联的元素。它将在每次勾选时调用该方法,以查看是否需要更新页面的状态。@H.Doe以另一种方式进行操作;不要让元素直接调用该方法,而是让组件调用该方法,并用结果设置一个布尔字段(例如,
userIsLoggedIn
)。元素仅使用该字段:
可能
*ngIf
位于
*ngFor
循环中?@5313M我不这么认为,请再显示一些代码。您没有提到要从哪个组件调用login。显示您的console.log(res);您的路由文件。当您不返回true或false时,您正在调用一个函数,它可能返回null或false,所以!会把它变成现实。为什么难以置信?Angular必须不断调用该方法,以确定它是否仍应显示关联的元素。它将在每次勾选时调用该方法,以查看是否需要更新页面的状态。@H.Doe以另一种方式进行操作;不要让元素直接调用该方法,而是让组件调用该方法,并用结果设置一个布尔字段(例如,
userIsLoggedIn
)。元素仅使用该字段: