【问题标题】:Angular ng-show doesn't work if I add ng-if如果我添加 ng-if,Angular ng-show 不起作用
【发布时间】:2016-03-23 09:13:48
【问题描述】:

我正在使用 Angular 做一个 Web 应用程序,其中包含一个带有可折叠 tr 的表格。但是当我添加一些 ng-if 条件(如果数组中有/没有数据)时,ng-show 停止工作。 这是没有 ng-if 条件的工作代码:https://plnkr.co/edit/UPFF1RboN22RAVM8r18i?p=preview

      <thead>
    <tr role="row">
      <th class="details-control sorting_disabled" rowspan="1" colspan="1" aria-label="" style="width: 26px;">
        <th class="sorting_asc" tabindex="0" aria-controls="example" rowspan="1" colspan="1" aria-label="Projects: activate to sort column descending" aria-sort="ascending" style="width: 306px;">Foods</th>
        <th class="sorting" tabindex="0" aria-controls="example" rowspan="1" colspan="1" aria-label=" EST: activate to sort column ascending" style="width: 84px;"><i class="fa fa-fw fa-user text-muted hidden-md hidden-sm hidden-xs"></i> Type</th>
        <th class="sorting" tabindex="0" aria-controls="example" rowspan="1" colspan="1" aria-label="Contacts: activate to sort column ascending" style="width: 107px;">Count</th>
    </tr>
  </thead>

<tbody ng-repeat="data in allData" >
  <tr>
      <td>
          <div class="cursor-pointer" ng-click="rows = !rows">
              <!-- <span class="fa" ng-class="{'fa-caret-down': rows, 'fa-caret-right': !rows}"></span> -->
              <p>open</p>
          </div>
      </td>
      <td>{{data.foodName}}</td>
      <td></td>
      <td>{{data.totalCount}}</td>
  </tr>
    <tr ng-repeat="a in data.avaiable" ng-show="rows" ng-if="allData && allData.length > 0">
      <td></td>
      <td></td>
      <td>{{a.foodType}}</td>
      <td>{{a.foodCount}}</td>
  </tr>

这是带有 ng-if 条件的无效代码。如果您在 plk https://plnkr.co/edit/IvlIXIfWpogNi5VXo2Eh?p=preview 看到,您会注意到行没有显示。为什么?

【问题讨论】:

  • 在 2 例中显示 2 行有什么问题?
  • 在第二个 plnkr 中,如果单击“打开”,它不会显示行

标签: javascript angularjs ng-show angular-ng-if


【解决方案1】:

Cosmin 是对的。

ng-if 创建一个新的子作用域。

您必须使用$parent 来使用您在ng-if 中使用的父变量

将您的 ng-click 更改为:

ng-click="$parent.rows = !rows"

工作Plunker

要显示未找到数据使用表格中的其他正文

<tbody ng-repeat="data in allData" >
  <tr ng-if="allData && allData.length > 0">
      <td>
          <div class="cursor-pointer" ng-click="$parent.rows = !rows">
              <!-- <span class="fa" ng-class="{'fa-caret-down': rows, 'fa-caret-right': !rows}"></span> -->
              <p>open</p>
          </div>
      </td>
      <td>{{data.foodName}}</td>
      <td></td>
      <td>{{data.totalCount}}</td>
  </tr>
    <tr ng-repeat="a in data.avaiable" ng-show="rows" ng-if="allData && allData.length > 0">
      <td></td>
      <td></td>
      <td>{{a.foodType}}</td>
      <td>{{a.foodCount}}</td>
  </tr>
  </tbody>

<!-- If there are no data -->
  <tbody ng-if="allData && (allData == null || allData.length == 0)">
       <tr>
           <td colspan="3"><span translate="generic.NO_DATA_FOUND">NO DATA FOUND</span></td>
       </tr>
  </tbody>

【讨论】:

  • 但它不显示最后一个 tr: 没有数据 如果没有数据
  • 我必须在哪里添加布尔值?
  • 啊!!你的正文有ng-repeat="data in allData",所以如果 allData 为空,你的 html 正文不会显示在页面上。
【解决方案2】:

如果只是替换代码,根据您对需求的理解

ng-click="rows = !rows"ng-click="data.rows = !data.rows"

ng-show="rows"ng-show="data.rows"

它必须工作

【讨论】:

  • data.rows 以前从未出现过......我的意思是在 JSON 中
【解决方案3】:

它不起作用的原因是 ng-if 创建了一个新的子作用域,从而破坏了原型作用域继承。

必须阅读以更好地理解这个问题

根据经验,始终使用controller as 语法。 Here 是你应该使用它的原因。

快速修复您可以从另一个对象访问 rows 属性,如下所示:ng-show="container.rows" - 这样您就不会破坏原型范围继承。查看工作示例here

【讨论】:

  • 谢谢@cosmin!但是我不太明白你快速修复
  • 我已切换到 快速修复 解决方案,在该解决方案中我将 rows 属性绑定到 data,如下所示:data.rows。你可以看到它在工作here
【解决方案4】:

如果您需要检查allData 中是否有数据,并且基于allData 想要使用ng-repeat,则在同一元素中使用ng-if 条件

<tbody ng-if="allData && allData.length > 0" ng-repeat="data in allData" >

而不是嵌套元素&lt;tr ng-if="allData &amp;&amp; allData.length &gt; 0"&gt;

最好在ng-click 中使用data.rows 而不是rows 来设置和在ng-show 中显示特定的数据行。喜欢:ng-click="data.rows = !data.rows"ng-show="data.rows"

总解可以是:

<table>
      <thead>
        <tr></tr>
      </thead>
    <tbody ng-if="allData && allData.length > 0" ng-repeat="data in allData" >
          <tr >
              <td>
                  <div class="cursor-pointer" ng-click="data.rows = !data.rows">
                      <p>open</p>
                  </div>
              </td>
              <td>{{data.foodName}}</td>
              .....
          </tr>
            <tr ng-repeat="a in data.avaiable" ng-show="data.rows" ng-if="data.avaiable && data.avaiable.length > 0">
              ....
              <td>{{a.foodCount}}</td>
          </tr>
      </tbody>
      <tbody ng-if="!allData || allData.length == 0">
        <tr class="yourClass">
          <td colspan="3">
             <span translate="generic.NO_DATA_FOUND"></span> 
          </td>
        </tr>
      </tbody>
</table>

【讨论】:

  • 超级!但是我怎样才能显示 如果没有数据?因为它在同一个tbody中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2017-09-08
  • 2015-03-31
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多