Javascript Angularjs访问对象索引

Javascript Angularjs访问对象索引,javascript,html,angularjs,Javascript,Html,Angularjs,我想检查每个对象上属性的状态true或false,以确定是否显示div 例如,以下方法非常有效。如果students.length>0,则显示学生标题,然后分别用姓名问候每个学生 <div ng-if="ctrl.classroomInfo.students.length > 0"> <h1>Students</h1> <ul> <li ng-repeat="student in ctrl.classroomInfo.s

我想检查每个对象上属性的状态true或false,以确定是否显示div

例如,以下方法非常有效。如果students.length>0,则显示学生标题,然后分别用姓名问候每个学生

<div ng-if="ctrl.classroomInfo.students.length > 0">
  <h1>Students</h1>
  <ul>
    <li ng-repeat="student in ctrl.classroomInfo.students">
      Welcome, {{student}}!
    </li>
  </ul>
</div>
但是如果我想增加另一个条件呢?我只想显示这个教室信息,如果至少有一个学生有好成绩

 <div ng-if="ctrl.classroomInfo.students.length > 0 &&
   ctrl.classroomInfo.students[$index].hasGoodGrades === true">
      <h1>Students</h1>
      <ul>
        <li ng-repeat="student in ctrl.classroomInfo.students">
          Welcome, {{student}}!
        </li>
      </ul>
    </div>
在上面的代码块中,我添加了students[$index].hasGoodGrades===true,但$index仅与ng repeat结合使用。这意味着我需要补充:

ng repeat=student在ctrl.classroomInfo.students中指向我的div标签。这是不好的,因为它会为每个成绩好的学生重复学生标题

 <div ng-if="ctrl.classroomInfo.students.length > 0 &&
   ctrl.classroomInfo.students[$index].hasGoodGrades === true">
      <h1>Students</h1>
      <ul>
        <li ng-repeat="student in ctrl.classroomInfo.students">
          Welcome, {{student}}!
        </li>
      </ul>
    </div>
如何访问每个学生对象的hasGoodGrades属性以确定天气是否显示整个div

更新:

感谢您回答有关过滤器的问题。如何处理过滤属性为另一个级别深度的情况?例如:

ctrl.classroomInfo.students.RESULTS.hasGoodGrades

ng if=ctrl.classroomInfo.students |筛选器:{RESULTS.hasGoodGrades:true}。长度>0不起作用

使用筛选器:

<div ng-if="(ctrl.classroomInfo.students | filter:{hasGoodGrades:true}).length > 0">
使用过滤器:

<div ng-if="(ctrl.classroomInfo.students | filter:{hasGoodGrades:true}).length > 0">

您可以在ng if或ng show条件中使用过滤器,如下所示:

    <div ng-show="(ctrl.classroomInfo.students | filter:filter(condition)).length">

      <div ng-repeat="student in ctrl.classroomInfo.students">
        {{student.name}}
      </div>
    </div>
 <div ng-if="ctrl.classroomInfo.students | hasGoodGrades">

您可以在ng if或ng show条件中使用过滤器,如下所示:

    <div ng-show="(ctrl.classroomInfo.students | filter:filter(condition)).length">

      <div ng-repeat="student in ctrl.classroomInfo.students">
        {{student.name}}
      </div>
    </div>
 <div ng-if="ctrl.classroomInfo.students | hasGoodGrades">

您可以通过创建一个返回布尔值的过滤器或一个返回布尔值的控制器方法来实现这一点。我主张使用过滤器保持视图控制器干燥

.filter( 'hasGoodGrades', [
    function(){
        return function( students ){
            if( students && students.length )
            {
                 var i = 0, m = students.length, student
                 for( i; i < m; i++ )
                 {
                      student = students[ i ]
                      if( student.hasGoodGrades )
                           return true
                 }
            }

            return false
        }
    }
])
编辑
我将把答案留在这里,作为另一个答案的替代。我的答案更明确、可读性更强,但我更喜欢@jstell的答案-

您可以通过创建一个返回布尔值的过滤器或一个返回布尔值的控制器方法来实现这一点。我主张使用过滤器保持视图控制器干燥

.filter( 'hasGoodGrades', [
    function(){
        return function( students ){
            if( students && students.length )
            {
                 var i = 0, m = students.length, student
                 for( i; i < m; i++ )
                 {
                      student = students[ i ]
                      if( student.hasGoodGrades )
                           return true
                 }
            }

            return false
        }
    }
])
编辑
我将把答案留在这里,作为另一个答案的替代。我的答案更明确,可读性更强,但我更喜欢@jstell的答案-

在循环中进行测试:

<div ng-if="ctrl.classroomInfo.students.length > 0">
   <h1>Students</h1>
      <ul>
        <li ng-repeat="student in ctrl.classroomInfo.students">
          <span ng-if="student.hasGoodGrades === true">Welcome, {{student}}!</span>
       </li>
     </ul>
</div>

但是将创建每个类的结构…

以在循环内进行测试:

<div ng-if="ctrl.classroomInfo.students.length > 0">
   <h1>Students</h1>
      <ul>
        <li ng-repeat="student in ctrl.classroomInfo.students">
          <span ng-if="student.hasGoodGrades === true">Welcome, {{student}}!</span>
       </li>
     </ul>
</div>

但是每个班级的结构都将被创建…

您将在每个学生的li中完成。把它放在你放的地方没有任何意义,因为那在循环之外。要回答关于嵌套过滤器属性的问题,请尝试以下过滤器:{RESULTS:{hasGoodGrades:true}}}src-你应该在每个学生的li范围内进行。把它放在你放的地方没有任何意义,因为那在循环之外。要回答关于嵌套过滤器属性的问题,请尝试以下过滤器:{RESULTS:{hasGoodGrades:true}}}src-当属性链接到另一个级别时,这是如何工作的?例如,ctrl.classroomInfo.students.results.hasGoodGrades过滤器将被写为|过滤器:{results.hasGoodGrades:true}还是错误?问是因为那对我不起作用me@bruh我认为在嵌套属性的情况下,您需要提供一个函数而不是一个对象作为过滤表达式。有关参数的详细信息,请参阅。当属性链接到另一个级别时,这是如何工作的?例如,ctrl.classroomInfo.students.results.hasGoodGrades过滤器将被写为|过滤器:{results.hasGoodGrades:true}还是错误?问是因为那对我不起作用me@bruh我认为在嵌套属性的情况下,您需要提供一个函数而不是一个对象作为过滤表达式。请参阅以获取详细的论证。谢谢。我将需要重构到这样的解决方案,一旦我让它与其他一个内联响应一起工作。谢谢。我将需要重构到这样的解决方案,一旦我与其他一个内联响应一起工作。如果没有学生取得好成绩,这将仍然显示classroomInfo div。但是将创建每个类的结构。。。所以是的。如果没有学生有好成绩,这仍然会显示classroomInfo分区。但是每个班级的结构将被创建。。。所以是的。