typescript 预期 2 个参数,但得到 1.ts(2554) core.d.ts(8064, 47):未提供“opts”的参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/56669922/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-21 05:50:04  来源:igfitidea点击:

Expected 2 arguments, but got 1.ts(2554) core.d.ts(8064, 47): An argument for 'opts' was not provided

typescriptnativescriptnativescript-angular

提问by Charlie Pope

Error

错误

Expected 2 arguments, but got 1.ts(2554) core.d.ts(8064, 47): An argument for 'opts' was not provided.

预期 2 个参数,但得到 1.ts(2554) core.d.ts(8064, 47):未提供“opts”的参数。

Code is from NativeScript Marketplace

代码来自 NativeScript Marketplace

https://play.nativescript.org/?template=play-ng&id=Hqp5UQ&v=3073

https://play.nativescript.org/?template=play-ng&id=Hqp5UQ&v=3073

I've brought the code over verbatim and I"m getting the errors in my export class on

我已经逐字逐句地提供了代码,并且在我的导出类中遇到了错误

@ViewChild("password") password: ElementRef;
@ViewChild("confirmPassword") confirmPassword: ElementRef;

Does anyone know how to resolve this?

有谁知道如何解决这个问题?

import { Component, ElementRef, ViewChild } from "@angular/core";
import { alert, prompt } from "tns-core-modules/ui/dialogs";
import { Page } from "tns-core-modules/ui/page";
import { RouterExtensions } from "nativescript-angular/router";

import { User } from "../shared/user.model";
import { UserService } from "../shared/user.service";

@Component({
    selector: "app-login",
    moduleId: module.id,
    templateUrl: "./login.component.html",
    styleUrls: ["./login.component.css"]
})
export class LoginComponent {
    isLoggingIn = true;
    user: User;
    processing = false;
    @ViewChild("password") password: ElementRef;
    @ViewChild("confirmPassword") confirmPassword: ElementRef;

    constructor(private page: Page, private userService: UserService, private routerExtensions: RouterExtensions) {
        this.page.actionBarHidden = true;
        this.user = new User();
        this.user.email = "[email protected]";
        this.user.password = "password";
    }

    toggleForm() {
        this.isLoggingIn = !this.isLoggingIn;
    }

    submit() {
        if (!this.user.email || !this.user.password) {
            this.alert("Please provide both an email address and password.");

            return;
        }

        this.processing = true;
        if (this.isLoggingIn) {
            this.login();
        } else {
            this.register();
        }
    }

    login() {
        this.userService.login(this.user)
            .then(() => {
                this.processing = false;
                this.routerExtensions.navigate(["/home"], { clearHistory: true });
            })
            .catch(() => {
                this.processing = false;
                this.alert("Unfortunately we could not find your account.");
            });
    }

    register() {
        if (this.user.password !== this.user.confirmPassword) {
            this.alert("Your passwords do not match.");

            return;
        }
        this.userService.register(this.user)
            .then(() => {
                this.processing = false;
                this.alert("Your account was successfully created.");
                this.isLoggingIn = true;
            })
            .catch(() => {
                this.processing = false;
                this.alert("Unfortunately we were unable to create your account.");
            });
    }

    forgotPassword() {
        prompt({
            title: "Forgot Password",
            message: "Enter the email address you used to register for APP NAME to reset your password.",
            inputType: "email",
            defaultText: "",
            okButtonText: "Ok",
            cancelButtonText: "Cancel"
        }).then((data) => {
            if (data.result) {
                this.userService.resetPassword(data.text.trim())
                    .then(() => {
                        this.alert(`Your password was successfully reset. Please check your email for
                        instructions on choosing a new password.`);
                    }).catch(() => {
                        this.alert("Unfortunately, an error occurred resetting your password.");
                    });
            }
        });
    }

    focusPassword() {
        this.password.nativeElement.focus();
    }
    focusConfirmPassword() {
        if (!this.isLoggingIn) {
            this.confirmPassword.nativeElement.focus();
        }
    }

    alert(message: string) {
        return alert({
            title: "APP NAME",
            okButtonText: "OK",
            message: ("{message}")
        });
    }
}

The expected output is when the emulator loads it should detect a logged out user and show them the login page.

预期的输出是当模拟器加载时它应该检测到一个已注销的用户并向他们显示登录页面。

回答by Narendra

That is because of breaking change in new Angular. You need to pass like below

那是因为新的 Angular 发生了重大变化。你需要像下面一样通过

@ViewChild("password", { static: true }) password: ElementRef;
@ViewChild("confirmPassword", { static: true }) confirmPassword: ElementRef;

A new static flag has been introduced to not break existing applications, so if you want to keep the old behavior even when you'll switch to Ivy, you can write:

引入了一个新的静态标志来不破坏现有的应用程序,所以如果你想在切换到 Ivy 时保持旧的行为,你可以写:

@ViewChild('password', { static: true }) static: ElementRef<HTMLDivElement>;

You can further read here : https://angular.io/api/core/ViewChild#description

您可以在此处进一步阅读:https: //angular.io/api/core/ViewChild#description