【问题标题】:Does angular.equals() work as an angular expressions?angular.equals() 是否可以用作角度表达式?
【发布时间】:2015-01-12 00:07:34
【问题描述】:

如果对象非空,我会尝试显示 div。使用this 答案,我试图使用angular.equals 来检查空虚,但它的行为不符合预期

var test = angular.module('test',[]);

test.controller('testCtrl', ['$scope', function($scope){
  $scope.foo={};
  $scope.bar="bam"
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test">
  <div ng-controller="testCtrl">
    <div ng-show="!angular.equals(foo,{})">{{bar}}</div>
  </div>
</div>

这里的期望是bar 的值仅在foo 不等于空对象时才会显示。但是,foo 显然设置为{},但bar 仍然显示。

【问题讨论】:

    标签: javascript angularjs object equality


    【解决方案1】:

    更简洁的方法是只将 angular equals 方法添加到 $scope:

    var test = angular.module('test',[]);
    
    test.controller('testCtrl', ['$scope', function($scope){
       $scope.angularEquals = angular.equals;
    }
    

    然后就可以在模板中使用equals方法了,比如:

    <div ng-show="!angularEquals(foo,{})">{{bar}}</div>
    

    【讨论】:

    • 这有什么缺点吗?我的意思是,既然它看起来很常见,为什么它现在还不可用?
    • 不,没有缺点。默认情况下,Angular 的 equals 方法不会添加到范围中,以保持范围较小,并且大多数情况下 javascript equals 就足够了。
    【解决方案2】:

    您的视图正在范围内寻找函数,而$scope.angular.equals 不存在。你需要这样写:

    var test = angular.module('test', []);
    
    test.controller('testCtrl', ['$scope',
      function($scope) {
        $scope.foo = {};
        $scope.bar = "bam";
        $scope.isEmpty = function(obj) {
          return angular.equals(obj,{});
        };
      }
    ]);
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="test">
      <div ng-controller="testCtrl">
        <div ng-hide="isEmpty(foo)">{{bar}}</div>
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      如果您想从模板或表达式访问angular 对象,您必须使其在您想使用它的范围内可用。在这种情况下,您可以将其放在testCtrl 的范围内。

      var test = angular.module('test',[]);
      
      test.controller('testCtrl', ['$scope', function($scope){
        $scope.angular = angular;
        $scope.foo={};
        $scope.bar="bam"
      }]);
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
      <div ng-app="test">
        <div ng-controller="testCtrl">
          <div ng-show="!angular.equals(foo,{})">{{bar}}</div>
        </div>
      </div>

      我通常将实用程序对象放在$rootScope 上,因此它们随处可用。

      【讨论】:

      • 你可以通过角度表达式访问 rootscope 吗?
      • @DavidGrinberg 您可以从角度表达式访问根范围上定义的任何内容,以及从根范围继承的所有其他范围。如果您将 JS 更改为 $rootScope.angular = angular;,则答案中的示例将表现相同。
      【解决方案4】:

      Angular 函数不能内联使用,AFAIK。 您可以改为使用控制器内部的函数进行相等检查并返回结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-19
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多