【问题标题】:Angular ng-show does not show/hide based on function return valueAngular ng-show 不会根据函数返回值显示/隐藏
【发布时间】:2016-08-01 03:42:07
【问题描述】:

所以我的 Angular 应用程序是一个庞然大物,所以我在这里粘贴相关部分只是为了看看 SO 的 Angular Gurus 是否可以发现任何可以帮助我的东西。

我的 HTML 代码如下:

<span class='span_class' ng-show='{{showHideBasedOnFlag(id)}}'>
  ...data...
</span>

在 Angular 中我有:

$scope.showHideBasedOnFlag = function(id)
{

   var flag = getFlag(id);
   if(flag == 1) return true; 
   if(flag == -1) return false;
   return true;
}

我有三个跨度,其中第一个的标志为 1,因此应该显示,另外两个的标志为 -1,因此应该隐藏。这在页面加载时按预期工作(第一个跨度显示,其他两个被隐藏)。但是当我检查跨度 2 和 3 时,它们的 HTML 代码如下所示:

<span class='span_class ng-hide' ng-show="false">

所以我的第一个问题是:ng-hide 被 Angular 添加以及ng-show 也存在是否正常?当我的 HTML 中有代码 ng-show='{{showHideBasedOnFlag(id)}}' 时,两者都会被添加

其次,更重要的是:我有一个按钮,单击该按钮会将跨度 2 和 3 的标志更新为 1 的值。发生这种情况后,我预计跨度会显示出来,但他们没有。然后我显式调用showHideBasedOnFlag 函数和console.logged 以确保函数返回正确的真假。但是,我的 HTML DOM 没有任何变化,跨度仍然隐藏。

我对此感到头疼,并且已经没有想法了......非常感谢任何帮助!

【问题讨论】:

  • 从您的代码中删除 {{}}
  • @vinayakj:试过了,没有帮助:(
  • ng-show 接受一个表达式...类似于ng-show="myVar",其中 myVar 为真或假
  • @WalksAway 我调用showHideBasedOnFlag 的函数返回true 或false...这不起作用吗?
  • 它会,但你需要像@vinayakj 建议的那样删除{{}}

标签: javascript jquery html css angularjs


【解决方案1】:

您正在使用双括号进行插值。但是ng-show 不是插入值的指令,它是基于真/假的。因此,您需要一个功能,到目前为止一切都很好。但在 Angular 1.x 中,传递函数的指令不带双括号。

<span class='span_class' ng-show='showHideBasedOnFlag(id)'>
  ...data...
</span>


所以我的第一个问题是:ng-hide 被添加是否正常 Angular 以及 ng-show 是否也存在?两者都得到 当我有代码 ng-show='{{showHideBasedOnFlag(id)}}' 在我的 HTML

是的,这是正常行为,因为 ng-show 和 ng-hide 是使用元素的可见性属性的互补开关,而 ng-if 则完全从 DOM 中添加或删除元素。


【讨论】:

    【解决方案2】:

    当您将函数包含在{{}} 中时,它只会在第一次解析为 false(或任何初始值),因为这就是表达式语法的用途。 ng-show/ng-hide 期望的表达式是 truefalse,因此最好使用根据条件在内部更改的函数或变量。

    请参阅下面的示例以供参考。

    function TodoCtrl($scope) {
      $scope.id;
      
      $scope.showHideBasedOnFlag = function(id) {
        var flag = getFlag(id);
        if (flag == 1) return true;
        if (flag == -1) return false;
        return true;
      }
    
      function getFlag(id) {
        return id; // just simulation
      };
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app>
      <h2>Todo</h2>
      <input placeholder="Enter 1 to show -1 to hide" ng-model="id">
      <div ng-controller="TodoCtrl">
        <span class='span_class' ng-show='showHideBasedOnFlag(id)'>
      ...data...
    </span>
      </div>
    </div>

    【讨论】:

    • 您将&lt;input&gt; 放在ngController 上方...也可以在function 中简单地使用return flag != -1 而不是3 行。
    • @developer033 我保留了 OP 的原始代码,以便他/她可以快速联系。当然 OP 可以重构代码
    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    相关资源
    最近更新 更多