2016-06-21 91 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