Angular - array.push()刷新页面

时间:2017-08-28 02:55:20

标签: javascript arrays angular arraylist push

此功能应该将某些数字推送到我要在视图中显示的数组。

jQuery(document).ready(function() {
var SideNav = $('.side-nav'),
    NavTrigger = $('.nav-trigger'),
    Content = $('.content'),
    ApartmentAlarm = $('#Alarm'),

$('.ui-flipswitch').click(function(){console.log($(this).hasClass('ui-flipswitch-active') ? 'On' : 'Off')})

NavTrigger.on('click', function(event) {
    event.preventDefault();
    alert("click works");
    $([SideNav, NavTrigger]).toggleClass('nav-visible');
});
ApartmentAlarm.on('click', function() {
    //event.preventDefault();
    Content.load('alarm.html');
    $([SideNav, NavTrigger]).toggleClass('nav-visible');
});



<html>
    <head>
        <title></title>
        <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
        <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
        <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    </head>

    <body>
        <form>
            <label for="LeftSwitch">Left Light:</label>
            <input type="checkbox" data-role="flipswitch" name="LeftSwitch" id="LeftSwitch">
            <br>
            <label for="RightSwitch">Right Light</label>
            <input type="checkbox" data-role="flipswitch" name="RightSwitch" id="RightSwitch">
        </form>
        <script type="text/javascript">
            $(document).ready(function() {
                console.log('hello');
                $('#LeftSwitch').on('flipswitchcreate', function(event, ui) {
                    alert('me')
                });
                //$('.ui-flipswitch').click(function(){console.log($(this).hasClass('ui-flipswitch-active') ? 'On' : 'Off')})
            })
        </script>
    </body>
    </html>



<html>

<head>
    <title>

    </title>
    <link rel="stylesheet" href="apt.css">
</head>

<body>
    <header class="page-header">
        <div class="apartment-name">Carlson Casa</div>
        <div class="data-top">
            <ul class="top-data">
                <li>Time</li>
                <li>Outside Temp</li>
                <li>Inside Temp</li>
                <li><a href="#0" class="nav-trigger">Menu<span></span></a></li>
            </ul>
        </div>
    </header>
    <main class="main-content">
        <nav class="side-nav">
            <ul>
                <li><a href="#">Apartment</a></li>
                <li class="nav-label">Living Room</li>
                <li><a href="#" id="Alarm">Alarm control</a></li>
                <li><a href="#" id="Chandelier">Chandelier</a></li>
                <li class="nav-label">Bedroom</li>
                <li><a href="#" id="BedroomLights">Lights</a></li>
                <li><a href="#" id="AlarmClock">Alarm Clock</a></li>
            </ul>
        </nav>
        <div class="content">
            Controls go here
        </div>
    </main>
    <script src="jquery-2.1.4.js"></script>
    <script src="main.js"></script>

</body>

</html>

一切正常,但一旦我加入&#34; this.array.push(i)&#34;它一直刷新我的页面提交(在提交时调用此功能)。我删除它,一切正常,它以正确的方式迭代,找到它应该做的数字和一切。即使我在函数内部创建数组并推送它,它也可以正常工作,但是当我将它作为一个类使用它时,它就会成为一个&#34; atribute&#34;并使用&#34;这个&#34;作为参考它不起作用(开始刷新)。

@Component({
  selector: 'app-task2',
  templateUrl: './task2.component.html',
  styleUrls: ['./task2.component.css']
})
export class Task2Component implements OnInit {

  array: [number];
  input;

  constructor() {}
  ngOnInit() {}
}

2 个答案:

答案 0 :(得分:1)

我知道它看起来很奇怪,但是窍门很简单。

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

array: number[] = [];

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

答案 1 :(得分:0)

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

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

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

我是否正确地说当你输入一个素数时,你只需要一次刷新,即正确的行为?如果是这样,那么您可以通过对单独的变量执行所有push,然后将该单独的变量复制到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之间的其他数字:它们不能是因子。所以你可以修改循环的第一行。 Squaring比平方根更快,因此您可以测试i*i<=this.input的速度而不是i<=Math.sqrt(this.input)。如果它不是1,你只需要记住push this.input的最终值,因为这将是最大的因素。

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的下一个周期将测试相同的因子,随后的周期将继续测试相同的因子,直到它不再是一个因素。 / p>

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