2016-06-21 93 views
-1

我想使用下面的代碼爲瀏覽器窗口的innerWidth設置一個範圍變量。它在控制檯中查看時有效,但函數不更新$ scope變量。爲什麼?

angular.element($window).bind('resize', function() { 
    console.log('resize', $window.innerWidth); // I can see change here 
    $scope.window_width = $window.innnerWidth; // no change here 
}); 
+0

'console.log($ scope.window_width)'說的是什麼? –

回答

2

要綁定與jQlite一些東西,住外面角,所以你必須手動在這裏調用$digest循環,否則Angular不知道有變化。

angular.element($window).bind('resize', function() { 
    console.log('resize', $window.innerWidth); 
    $scope.window_width = $window.innerWidth; 
    $scope.$evalAsync(); 
}); 

$scope.$evalAsync()將調用摘要循環使用相同的JS事件中發射的機率更大打勾,然後$timeout(更多信息here

+0

這是錯誤的。更新範圍變量時不需要應用 –

+0

您必須從jQuery/jQLite中執行此操作時 –

+0

沒有像Async()這樣的函數 – MFB

-1

試試這個:

$scope.$apply(function() { $scope.window_width = $window.innnerWidth; }) 

您綁定DOM事件,所以必須強制角消化階段

+0

這是錯誤的。更新範圍變量時不需要應用 –

+0

閱讀角度文檔...他綁定到摘要階段之外的事件。要角度檢測變化,你必須調用摘要階段 – Silvinus

+0

我把它放在綁定函數裏面,對吧?似乎沒有工作 – MFB

3

你做了愚蠢的錯誤可能是當你鍵入問題。

$scope.window_width = $window.innnerWidth; //innnerWidth should be innerWidth 

而且由於調整大小是你更新你需要通過調用$scope.$digest();手動運行摘要週期範圍可變后角外發生的,所以我們要告訴角度,以有東西在範圍內進行更新。我們可以用什麼來代替$digest()

  1. 可以包裹代碼$timeout會觸發消化週期它的自我

    $timeout(function() { $scope.window_width = $window.innerWidth; });

  2. 使用$scope.$apply();

    $scope.window_width = $window.innerWidth; $scope.$apply();

他re是一個demo

+0

噢,我的上帝......我很尷尬 – MFB

相關問題