AngularJS - ng-show,范围变量不起作用

use*_*751 4 javascript angularjs

当手机的方向发生变化时,我试图隐藏/显示某些内容.

这是我的观点:

<div ng-controller="ModelCtrl">
    <p ng-show="isLandscape">Landscape - {{ isLandscape }}</p>
    <p ng-show="!isLandscape">Portrait - {{ !isLandscape }}</p>
</div>
Run Code Online (Sandbox Code Playgroud)

这是控制器代码段:

    $scope.isLandscape = false;

    // Listen for orientation changes
    window.addEventListener("orientationchange", function() {
        // Announce the new orientation number
        switch(window.orientation) 
        {  
          case -90:
          case 90:
            $scope.isLandscape = true;
            alert($scope.isLandscape);
            break; 
          default:
            $scope.isLandscape = false;
            alert($scope.isLandscape);
            break; 
        }
    }, false);
Run Code Online (Sandbox Code Playgroud)

我能够在方向改变时提醒isLandscape的正确值,但似乎它不会更新视图,所以它总是在"纵向模式 - 真实"中说它.

mus*_*_ut 8

错过了一个$scope.$apply():

$scope.isLandscape = false;

// Listen for orientation changes
window.addEventListener("orientationchange", function() {
    // Announce the new orientation number
    switch(window.orientation) 
    {  
      case -90:
      case 90:
        $scope.isLandscape = true;
        $scope.$apply(); // <--
        break; 
      default:
        $scope.isLandscape = false;
        $scope.$apply(); // <--
        break; 
    }
}, false);
Run Code Online (Sandbox Code Playgroud)

一旦你改变了值,Angular就没有办法知道它应该检查值是否已经改变.$scope.$apply将触发一个摘要循环,这将使Angular通知$scope.isLandscape已更改.


更好的解决方案是注入$window控制器并将orientationchange事件监听器添加到控制器中.这样就不需要了$scope.$apply.