【问题标题】:Angular - array.push() refreshes pageAngular - array.push() 刷新页面
【发布时间】:2018-02-05 06:21:00
【问题描述】:

这个函数应该将某些数字推送到我要在视图中显示的数组中。

@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)”,它就会在提交时不断刷新我的页面(在提交时调用此函数)。我删除它,一切正常,它以正确的方式迭代,找到数字和它应该做的一切。即使我在函数内部创建数组并推送到它,它也可以正常工作,但是当我将它用作类“属性”并使用“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 = "";
}

【问题讨论】:

  • 请分享您的模板代码。顺便说一句,你为什么需要在内部调用onSubmit?

标签: javascript arrays angular arraylist push


【解决方案1】:

我知道这看起来很奇怪,但诀窍很简单。

只需初始化数组,重新加载问题就会消失。

array: number[] = [];

我的代码刚刚遇到了这个问题,这个技巧解决了这个问题。

【讨论】:

    【解决方案2】:

    在单独的变量中创建新数组,然后一步写入this.array

    您的问题中当前仅显示 javascript,因此我猜测模板包含的内容。我假设您的代码旨在分解一个数字?

    我怀疑多次刷新的原因是您的模板被编程为在更新时显示this.array。如果您正在输入一个包含许多因素的数字,您将看到许多刷新。

    我是否正确地说,当您输入质数时,您只会得到一次刷新,即正确的行为?如果是这样,那么您可以通过在单独的变量上执行所有 pushing 来修复它,然后将该单独的变量复制到 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&lt;=this.input 的速度而不是i&lt;=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 的下一个循环将测试 same 因子,随后的循环将继续测试相同的因子,直到它不再是一个因子。

    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 = "";
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 2017-10-06
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多