【问题标题】:AngularJS: ng-switch + ng-repeat with button inside of switch statementAngularJS:ng-switch + ng-repeat 在 switch 语句中带有按钮
【发布时间】:2015-09-10 06:08:16
【问题描述】:

我对 Angular 还是很陌生,我有点被一个问题困住了。我有一个显示项目的 ng-repeat。在项目中,我有一个“显示更多信息”按钮,当您单击它时,应该会导致新视图替换当前视图(包括显示更多信息按钮)。然后,新视图将有一个“返回”按钮,该按钮将切换回原始状态。

不幸的是,我似乎无法弄清楚如何让它发挥作用。

这是我所知道的……

<article ng-repeat="item in items" class="items">
  <div ng-switch on="view">
    <div ng-switch-default>
      <p>Default State for {{item}}</p>
      <div class="btn">More Info
    </div>
    <div ng-switch-when="info">
      <p>Info for {{item}}</p>
      <div class="btn">Go back</div>
    </div>
  </div>
</article>

如果有人可以在这里帮助我,我将不胜感激。谢谢。

【问题讨论】:

    标签: javascript angularjs angularjs-ng-repeat ng-repeat ng-switch


    【解决方案1】:

    您可以在单击按钮时设置view 的值。我建议你使用item.view 而不是view,它会阻止其他元素的视图被切换。

    <article ng-repeat="item in items" class="items">
        <div ng-init="viewDefaultValue = item.view;" ng-switch on="item.view">
            <div ng-switch-default>
                <p>Default State for {{item}}</p>
                <div class="btn" ng-click="item.view = 'info';">More Info</div>
            </div>
            <div ng-switch-when="info">
                <p>Info for {{item}}</p>
                <div class="btn" ng-click="item.view = viewDefaultValue;">Go back</div>
            </div>
        </div>
    </article>
    

    这是一个工作示例。

    (function() {
      angular
        .module('myApp', [])
        .controller('myController', function($scope) {
          $scope.items = [{
            view: '',
            text: 'item1'
          }, {
            view: '',
            text: 'item2'
    
          }]
        });
    })();
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="myApp" ng-controller="myController">
    
      <div ng-repeat="item in items" class="items">
        <div ng-init="viewDefaultValue = item.view;" ng-switch on="item.view">
          <div ng-switch-default>
            <p>Default State for {{item.text}}</p>
            <div class="btn" ng-click="item.view = 'info';">More Info
            </div>
          </div>
          <div ng-switch-when="info">
            <p>Info for {{item.text}}</p>
            <div class="btn" ng-click="item.view = viewDefaultValue;">Go back</div>
          </div>
        </div>
      </div>

    【讨论】:

    • 我明白了,这似乎是最干净的解决方案。非常感谢。
    • 这实际上似乎对我不起作用。我尝试将“视图”添加到我的 json 对象(这是 items 包含的内容),但仍然没有运气。
    • @IanGray,您在&lt;div class="btn"&gt;More Info 之后错过了关闭div,因此它产生了HTML 问题。我还添加了一个工作示例
    • 美丽。谢谢,我试图让我的代码正常工作,但一直遇到问题,正要回来询问,但你的示例解决了这个问题。
    【解决方案2】:

    使用ng-hideng-show 而不是ng-switch

    <article ng-repeat="item in items" class="items">
      <div ng-show="isviewvisible">
        <div>
          <p>Default State for {{item}}</p>
          <div class="btn" ng-click="more()">More Info
        </div>
        <div ng-hide="isviewvisible">
          <p>Info for {{item}}</p>
          <div class="btn" ng-click="goBack()">Go back</div>
        </div>
      </div>
    </article>
    

    现在在 angularjs 中

    $scope.isviewvisible = true;
    
    $scope.more = function(){
      $scope.isviewvisible = false;
    }
    
    $scope.goBack = function(){
      $scope.isviewvisible = true;
    }
    

    当您点击more() 时,它将隐藏视图并显示更多信息

    当您单击goBack() 时,它将隐藏更多信息并显示视图

    【讨论】:

    • 感谢您的回复,这似乎更有意义。但是,由于这是在 ng-repeat 中,这不会导致我的所有项目切换更多信息吗?
    • 我明白了。你能把你的项目对象包含的 json 键放在什么地方吗??我们可能会找到可以替代 isviewvisible 的东西
    • 我的 JSON 当前不包含密钥,但我可以添加一个。因此,如果我们为每个人都有一个简单的迭代 id (1, 2, 3)。我如何使用它来隔离特定项目的切换?
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多