Javascript 如果语句为真,则对一个或多个ng进行角度检查

Javascript 如果语句为真,则对一个或多个ng进行角度检查,javascript,angularjs,angular-ng-if,Javascript,Angularjs,Angular Ng If,我的情况是,我正在构建一个动态表,其中单元格包含使用多个ng if语句的数据聚合。基本上,我需要知道if语句中是否没有一个是真的,这样我就可以做另一个ng if 这是我正在做的一个简化示例。大约有20列具有不同的聚合结果 {{data1}} {{data2}} {{data3}} {{data4}} 我不能使用ng开关,因为条件完全不同。这是数据的聚合,而不是if/else。我更喜欢一种不同的方法,而不是仅仅添加一个“!”因为我的一些聚合包含许多条件,而一些if语句并非无关紧要。还有许多聚合

我的情况是,我正在构建一个动态表,其中单元格包含使用多个
ng if
语句的数据聚合。基本上,我需要知道if语句中是否没有一个是真的,这样我就可以做另一个
ng if

这是我正在做的一个简化示例。大约有20列具有不同的聚合结果


{{data1}}
{{data2}}
{{data3}}
{{data4}}
我不能使用ng开关,因为条件完全不同。这是数据的聚合,而不是if/else。我更喜欢一种不同的方法,而不是仅仅添加一个“!”因为我的一些聚合包含许多条件,而一些if语句并非无关紧要。还有许多聚合单元,因此维护过于复杂的“其他”条件将是一场噩梦


理想情况下,如果语句为true,我希望能够在任何
ng上为true指定一个变量。有什么想法吗?

我不知道这是否是一个最佳实践,但我相信您应该在JS中包含所有逻辑,HTML应该只是一个反映您正在显示的范围状态的模板

通过这种方式,您的条件将始终在JS中检查

更新:基于新内容:

所以你有数据,看起来你需要先处理它,否则你的应用程序性能会受到观察者过载的影响

首先:简化HTML,所有的逻辑,如
record.some_number>0&&record.type==“SomeType”
都属于JS

<table>
    <tr ng-repeat="record in data"> 
        <td>
            <span ng-repeat="item in record.dataToShow" ng-bind-html='item'></span> // now you just repeat the data that has been processed
        </td>
    </tr>
</table>

//现在您只需重复已处理的数据
第二:以循环的方式在JavaScript中进行处理

$scope.data = [ some array with lots of stuff ];

for( var idx in $scope.data ){
    var record = $scope.data[ idx ]; // assuming JSON object
    var dataToShow = []; // store your data(s) in an array

    // if a condition is met, push your data onto the array
    if( record.some_number > 0 && record.type == 'SomeType' ){
        dataToShow.push( data1 );
    }
    if( record.age >= 20 && record.age <= 50 && record.gender == 'MALE' ){
        dataToShow.push( data2 );
    }
    // continue processing conditions

    if( dataToShow.length === 0 ){ // none have been true if array is empty
        // do something
    }
    record.dataToShow = dataToShow;
}
$scope.data=[一些包含大量内容的数组];
for(var idx,单位为$scope.data){
var record=$scope.data[idx];//假定为JSON对象
var dataToShow=[];//将数据存储在数组中
//如果满足条件,则将数据推送到阵列上
如果(record.some_number>0&&record.type==“SomeType”){
dataToShow.push(data1);
}

if(record.age>=20&&record.age获取范围函数,以决定如何处理各种条件下的ng if

<span ng-if="showHideCell(this)">{{data1}}</span>
<span ng-if="showHideCell(this)">{{data2}}</span>


如果应用程序对吞吐量至关重要,并且有很多控件,我建议在他的回答中使用SoluableNonagon的方法。每个消化周期只检查一个变量。

您可能会感兴趣,这是angular的ng If的一个很好的If else扩展。

您可以在c语言中使用通用方法ontroller检查元素上的条件,而您可以有另一个条件,它将应用于所有元素,本质上调用前面提到的泛型方法

是一个plunk做了一些类似于你想要实现的事情,可能会给你一个想法

例如,我在这里要做的是有两个数组,一个是奇数值,一个是偶数值。我在控制器上有一个方法
condition
,它接受一个值(从
ng repeat
循环获取数组的值),还有一个
all
方法,它调用
条件

  $scope.condition = function(element, value) {
    // Just returns true for even values

    if (typeof value === "number")
      return value % 2 == 0;
    else if (value instanceof Array) {
      return value.every(function(item) {
        return item % 2 == 0;
      });
    }

  }

  $scope.all = function(element, value) {
    return $scope.condition(element, value);
  }

您可以使用类似的方法。

您应该在
$scope
上创建一个变量,您可以将其映射到您的条件,而不是在JS中执行所有检查。是的。这正是我想要做的,但不确定如何使用ng if语句。我假设唯一的方法是在我的控制器中。这并不理想,因为当我必须在两个地方维护我的条件时。我将在回答中向您展示一个示例。我想我可以为我的所有条件创建$scope变量,然后在我的html页面中使用这些变量。我希望所有这些都保留在页面上。在html页面上没有办法做到这一点吗?这在我的应用程序中是大量的重构。不是真的,很抱歉他很麻烦,我不想这么说,但HTML中应该没有什么逻辑。如果你必须重构页面,那么你应该这样做,这将使以后的维护更加容易。另一个困难是,这些都是使用ng repeat的HTML表的一部分。与任何其他标记相比,有什么困难?你必须发布你的cod我假设一行通过ng点击控制另一行的显示,但我仍然坚持我的声明,将控件放在JS中。如果是逻辑,那么它属于编程端(JS),而不是标记端(HTML)我的意思是,这些条件表示一条记录的表中的一个单元格。如果我使用范围变量,我必须使用条件数组或类似的数组,每行一个条件,该行所有单元格的所有条件。我将更新代码,使其更具体。我不建议将函数分配给ng If,而这确实有效——它也在每个摘要周期上运行,而不仅仅是一个事件。
  $scope.condition = function(element, value) {
    // Just returns true for even values

    if (typeof value === "number")
      return value % 2 == 0;
    else if (value instanceof Array) {
      return value.every(function(item) {
        return item % 2 == 0;
      });
    }

  }

  $scope.all = function(element, value) {
    return $scope.condition(element, value);
  }