Angular - array.push() 刷新页面
Angular - array.push() refreshes page
此函数应将某些数字推送到我将在视图中显示的数组。
@Component({
selector: 'app-task2',
templateUrl: './task2.component.html',
styleUrls: ['./task2.component.css']
})
export class Task2Component implements OnInit {
array: [number];
input;
constructor() {}
ngOnInit() {}
}
一切正常,但只要我包含 "this.array.push(i)",它就会在提交时不断刷新我的页面(在提交时调用此函数)。我删除它,一切正常,它以正确的方式迭代,找到数字和它应该做的一切。即使我在函数内部创建数组并推送给它,它也能正常工作,但是当我将它用作 class "atribute" 并使用 "this" 作为参考时它不起作用(开始刷新) .
onSubmit() {
for(var i=2; i<=this.input; i++) {
if(this.input % i == 0) {
this.input /= i;
this.array.push(i);
return this.onSubmit(); //does same even without this
}
}
this.input = "";
}
在单独的变量中创建新数组,然后一步写入this.array
目前您的问题中只显示了javascript,所以我猜测模板包含的内容。我假设您的代码旨在分解数字?
我怀疑多次刷新的原因是您的模板被编程为在更新时显示 this.array
。如果您输入的数字包含很多因数,您会看到多次刷新。
我说的对吗,当您输入质数时,您只会刷新一次,即正确的行为?如果是这样,那么您可以通过对一个单独的变量执行所有 push
ing,然后将该单独的变量复制到 this.array
来修复它。例如:
onSubmit() {
let nextArray = [];
for(var i=2; i<=this.input; i++) {
if(this.input % i == 0) {
this.input /= i;
nextArray.push(i);
// Remove this line: return this.onSubmit();
}
}
this.array = nextArray;
this.input = "";
}
您可以通过仅达到 this.input
的平方根来节省迭代次数
当对 N 进行因式分解时,一旦您查看了(包括)sqrt(N),就无需查看 sqrt(N) 和 N 之间的其他数字:它们不能是因数。所以你可以修改循环的第一行。平方比平方根快,因此您可以测试 i*i<=this.input
而不是 i<=Math.sqrt(this.input)
的速度。你只需要记住 push
this.input 的最终值,如果它不是 1,因为这将是最大的因素。
onSubmit() {
let nextArray = [];
for(var i=2; i*i<=this.input; i++) {
if(this.input % i == 0) {
this.input /= i;
nextArray.push(i);
}
}
if (this.input !==1){
nextArray.push(this.input);
}
this.array = nextArray;
this.input = "";
}
注意重复因素
我怀疑您当前的代码无法正确分解多次出现相同因子的数字。例如,它只测试一次数字是否可以被 5 整除。因此,如果 this.input
为 250,即 2*5*5*5,它将输出 2、5、25。
为了解决这个问题,如果您还没有找到一个因素,您可以仅增加i
。这样当你找到一个因子时,for
的下一个循环将测试相同的因子,随后的循环将继续测试同一个因子,直到它不再是一个因素。
onSubmit() {
let nextArray = [];
for(var i=2; i<=this.input;) {
if(this.input % i == 0) {
this.input /= i;
nextArray.push(i);
} else {
i++;
}
}
this.array = nextArray;
this.input = "";
}
我知道这看起来很奇怪,但技巧很简单。
只需初始化数组,重新加载问题就会消失。
array: number[] = [];
我的代码刚刚遇到这个问题,这个技巧解决了这个问题。
此函数应将某些数字推送到我将在视图中显示的数组。
@Component({
selector: 'app-task2',
templateUrl: './task2.component.html',
styleUrls: ['./task2.component.css']
})
export class Task2Component implements OnInit {
array: [number];
input;
constructor() {}
ngOnInit() {}
}
一切正常,但只要我包含 "this.array.push(i)",它就会在提交时不断刷新我的页面(在提交时调用此函数)。我删除它,一切正常,它以正确的方式迭代,找到数字和它应该做的一切。即使我在函数内部创建数组并推送给它,它也能正常工作,但是当我将它用作 class "atribute" 并使用 "this" 作为参考时它不起作用(开始刷新) .
onSubmit() {
for(var i=2; i<=this.input; i++) {
if(this.input % i == 0) {
this.input /= i;
this.array.push(i);
return this.onSubmit(); //does same even without this
}
}
this.input = "";
}
在单独的变量中创建新数组,然后一步写入this.array
目前您的问题中只显示了javascript,所以我猜测模板包含的内容。我假设您的代码旨在分解数字?
我怀疑多次刷新的原因是您的模板被编程为在更新时显示 this.array
。如果您输入的数字包含很多因数,您会看到多次刷新。
我说的对吗,当您输入质数时,您只会刷新一次,即正确的行为?如果是这样,那么您可以通过对一个单独的变量执行所有 push
ing,然后将该单独的变量复制到 this.array
来修复它。例如:
onSubmit() {
let nextArray = [];
for(var i=2; i<=this.input; i++) {
if(this.input % i == 0) {
this.input /= i;
nextArray.push(i);
// Remove this line: return this.onSubmit();
}
}
this.array = nextArray;
this.input = "";
}
您可以通过仅达到 this.input
的平方根来节省迭代次数当对 N 进行因式分解时,一旦您查看了(包括)sqrt(N),就无需查看 sqrt(N) 和 N 之间的其他数字:它们不能是因数。所以你可以修改循环的第一行。平方比平方根快,因此您可以测试 i*i<=this.input
而不是 i<=Math.sqrt(this.input)
的速度。你只需要记住 push
this.input 的最终值,如果它不是 1,因为这将是最大的因素。
onSubmit() {
let nextArray = [];
for(var i=2; i*i<=this.input; i++) {
if(this.input % i == 0) {
this.input /= i;
nextArray.push(i);
}
}
if (this.input !==1){
nextArray.push(this.input);
}
this.array = nextArray;
this.input = "";
}
注意重复因素
我怀疑您当前的代码无法正确分解多次出现相同因子的数字。例如,它只测试一次数字是否可以被 5 整除。因此,如果 this.input
为 250,即 2*5*5*5,它将输出 2、5、25。
为了解决这个问题,如果您还没有找到一个因素,您可以仅增加i
。这样当你找到一个因子时,for
的下一个循环将测试相同的因子,随后的循环将继续测试同一个因子,直到它不再是一个因素。
onSubmit() {
let nextArray = [];
for(var i=2; i<=this.input;) {
if(this.input % i == 0) {
this.input /= i;
nextArray.push(i);
} else {
i++;
}
}
this.array = nextArray;
this.input = "";
}
我知道这看起来很奇怪,但技巧很简单。
只需初始化数组,重新加载问题就会消失。
array: number[] = [];
我的代码刚刚遇到这个问题,这个技巧解决了这个问题。