亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法在超時內設置 AngularJS 范圍變量

無法在超時內設置 AngularJS 范圍變量

慕無忌1623718 2021-08-26 15:05:24
我有一個關于這個問題的 jsfiddle。 https://jsfiddle.net/uvtw5kp1/4/$scope.Dropdown = {  open: false,  searchValue: "",  timer: null,  hideIt: function() {    this.timer = $timeout(function() {      alert("timeout happened the value will not change");      this.open = false;    }, 50);  },  hideItNotimer: function() {    this.open = false;  },  showIt: function() {    $timeout.cancel(this.timer);    this.open = true;  }};當我在 ng-mouseout 上調用 Dropdown.hideItNotimer() 時它沒有問題,但是當我調用 Dropdown.hideIt() 時,變量沒有設置。我添加了一個警報以確保計時器正常工作,并且我嘗試在之后執行 scope.apply。有效的是在計時器內調用范圍級別的函數:像這樣: $scope.setDropdownHidden = function(){   $scope.Dropdown.open = false; }并在它工作的超時內調用它,但如果可以的話,我想避免這種情況。我錯過了什么?
查看完整描述

2 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

Timeout 有它自己的作用域,因為它是一個閉包,所以 $scope.open = false 不會更新你的控制器 $scope.open 變量,你應該避免使用 timeout for 來更新作用域變量。您應該使用 bind as 綁定全局范圍 -


hideIt: function() {

  this.timer = $timeout(function() {

        this.open = false;

      }.bind(this), 50);

}


查看完整回答
反對 回復 2021-08-26
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

在您的超時函數中,this不引用 Dropdown 對象,而是可能引用該window對象。在 javascript 中,this總是指調用函數的對象,而不是定義它的對象。當 $timeout 調用您的回調函數時,它會使用 Dropdown 對象以外的其他對象,因為它不知道該對象。

您需要this將父函數中的值捕獲為閉包變量,或者使用angular.bind將回調函數綁定到 Dropdown 對象


查看完整回答
反對 回復 2021-08-26
  • 2 回答
  • 0 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號