angular.equals() 是不是可以用作角度表达式?

Posted

技术标签:

【中文标题】angular.equals() 是不是可以用作角度表达式?【英文标题】: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 仍然显示。

【问题讨论】:

【参考方案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。 您可以改为使用控制器内部的函数进行相等检查并返回结果。

【讨论】:

以上是关于angular.equals() 是不是可以用作角度表达式?的主要内容,如果未能解决你的问题,请参考以下文章

angular.equals() 占用了 50% 的执行时间

angularJs方法

NSSplitViewController 导致包含的视图在窗口角上绘制

角2材料2中的预填充垫自动完成

在父 div 上设置边框半径修剪图像角在 Safari 中不起作用

在 Windows 中是不是可以将部分内存用作虚拟文件