【问题标题】:Dynamic AngularJS disappears when using $timeout使用 $timeout 时动态 AngularJS 消失
【发布时间】:2016-08-26 06:39:38
【问题描述】:

我对 AngularJs 完全陌生,但我已经设法学习了框架的基础知识。然而,我最近遇到了 AngularJs 的一种奇异行为,它以动态性着称。

问题来了:

Index.html

<div ng-controller="userClick as clk">
 <div id="square1">{{ clk.board[0] }}</div>
</div>

app.js

app.controller('userClick', function($timeout) {
   this.board = ['', '', '', '', '', '', '', '', ''];

$timeout(reset, 1000);
function reset (){
 this.board = ['', '', '', '', '', '', '', '', ''];
 console.log(this.board); //returns ^^ (empty array)
}

预计当用户点击页面上的一个方块时,会执行一个函数并且一切顺利。但是,当我尝试使用 $timeout 函数将响应延迟一秒钟时,数组 this.board 成功重置为空数组,但 div 与id square1 不会再次变空。

似乎有些东西导致 Angular 在这一点上是静态的,我不明白。

注意:这是一款井字游戏。

【问题讨论】:

  • this 内部 reset() 函数与外部函数 this 不同。与 angular 无关,是 javascript 范围问题
  • 那么如何更改具有正确范围的板阵列??
  • 在控制器中存储对变量中this 的引用,并在函数内部使用该变量而不是this。见github.com/johnpapa/angular-styleguide/blob/master/a1/…
  • @charlietfl 非常感谢,终于成功了!!

标签: jquery angularjs dynamic timeout


【解决方案1】:

您可以将reset 函数声明为控制器函数并使用它。

app.controller('userClick', ['$timeout', function($timeout) {
    var ctrl = this;
    ctrl.board = ['', '', '', '', '', '', '', '', ''];

    ctrl.reset = function() {
       ctrl.board = ['', '', '', '', '', '', '', '', ''];
       console.log(ctrl.board); 
    };
    $timeout(ctrl.reset, 1000);

    // Rest of your controller logic
}]);

【讨论】:

  • 不应将ctrl 设置为全局变量
  • @charlietfl 为什么?我确定我不会创建另一个控制器或具有相同名称的变量
  • @YEAMA 因为这是一种糟糕的做法,可能会导致各种难以发现的错误。应始终使用var 声明变量
  • @sebastianForsberg 如果我想从控制器外部更改这个 ctrl.board 数组怎么办??
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 2013-01-31
  • 1970-01-01
  • 2013-07-04
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多