Javascript AngularJS element.bind(';resize';)不更新$scope变量

Javascript AngularJS element.bind(';resize';)不更新$scope变量,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我试图使用下面的代码为浏览器窗口的innerWidth设置一个范围变量。在控制台中查看时,它可以工作,但该函数不更新$scope变量。为什么? angular.element($window).bind('resize', function () { console.log('resize', $window.innerWidth); // I can see change here $scope.window_width = $window.innnerWidth; //

我试图使用下面的代码为浏览器窗口的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
});
试试这个:

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

绑定dom事件时,必须强制执行angular digest阶段

您正在使用angular之外的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
(更多信息)

您键入问题时可能犯了一个愚蠢的错误

 $scope.window_width = $window.innnerWidth; //innnerWidth should be innerWidth
更新scope变量后,需要通过调用
$scope.$digest()手动运行摘要循环因为调整大小是在angular之外发生的事情,所以我们必须告诉angular,在范围内有一些东西需要更新

我们还可以用什么来代替
$digest()

  • 您可以将代码包装在
    $timeout
    中,它会自行触发摘要循环

    $timeout(函数(){
    $scope.window\u width=$window.innerWidth;
    });

  • 使用
    $scope.$apply()类似

    $scope.window\u width=$window.innerWidth;
    $scope.$apply()


  • 这里有一个控制台.log($scope.window\u width)
    怎么说?这是错误的。更新作用域变量时不需要应用,从jQuery/jqlite进行更新时必须应用异步()之类的函数。他只是更新$scope变量。它在范围内立即可用。只有在必须调用监视函数时才需要应用它。@MFB my bad,应该是
    $evalAsync()
    这是错误的。更新范围变量Read angular文档时不需要应用。。。他绑定到摘要阶段之外的事件。要检测角度变化,你必须调用一个摘要阶段,我把它放在bind函数中,对吗?我的天啊,这似乎不起作用。。。我很尴尬