当我在 angular material 中添加新项目时,layout="row" 的高度没有改变

The height of layout="row" don't change when I'm adding new items in angular material

我有 html 这样的:

<body layout="row" ng-app="myApp" ng-cloak="ng-cloak" ng-controller="main">
  <md-content flex="100" layout="row" class="management-panelmd-background md-hue-1">
    <md-card class="md-whiteframe-4dp detail">
      <div layout="row" layout-align="begin begin" ng-repeat="item in vm.managementPanelsFields" style="margin-bottom: 30px;" class="row flex">
        <div flex="40" ng-show="item.isVisible">{{item.name}}</div>
        <div flex="60" ng-show="item.isVisible" class="spacing">
          <div ng-if="item.IsMultipleValue" class="multiple">
            <ul>
              <li ng-repeat="e in item.value track by $index" layout="row" layout-align="begin end">
                <div ng-if="item.fieldType == 'Int'" flex="45">
                  <md-input-container>
                    <label>{{item.watermarkText}}</label>
                    <input type="number" name="{{item.id}}-{{$index}}" ng-pattern="item.regexValidation" ng-required="item.isRequired" ng-model="item.value[$index]"/>
                  </md-input-container>
                </div>
                <div ng-if="item.complementary" flex="45">
                  <div ng-if="item.complementary.fieldType == 'Dropdown'">
                    <md-select ng-model="item.complementary.value[$index]">
                      <md-option ng-repeat="(key, value) in item.complementary.options" value="{{key}}">{{value}}</md-option>
                    </md-select>
                  </div>
                </div>
                <div flex="10" class="delete"><a ng-click="deleteValue(item, $index)">X</a></div>
              </li>
            </ul>
            <md-button ng-click="newValue(item)" class="md-raised md-primary">ADD</md-button>
          </div>
          <div ng-if="!item.IsMultipleValue" layout="row">
            <div ng-if="item.fieldType == 'TextArea'" flex="100" ng-class="{error: form[item.id].$error}">
              <textarea name="{{item.id}}" ng-trim="false" ng-required="item.isRequired" ng-pattern="item.regexValidation" placeholder="{{item.watermarkText}}" ng-model="item.value"></textarea>
            </div>
          </div>
        </div>
      </div>
    </md-card>
  </md-content>
</body>

当我使用添加按钮创建动态输入时,该按钮位于输入旁边的文本区域上方,并且具有 ng-repeat="item in vm.managementPanelsFields" 的 div 的高度没有即使内容有更大的高度也要改变。

这里是code pen

您可以将 overflow-y:scroll 添加到 ng-repeat="item in vm.managementPanelsFields" 的样式属性 像这样 style="margin-bottom: 30px;overflow-y:scroll;"

高度不会改变,因为您使用的是 flex。每行都设置为 flex: 1,这意味着行之间的高度比将是 1:1 = 相同的高度。

您的容器有 flex: 1 1 100%:这定义了内容的总高度将是屏幕高度的 100%,因此,每行将占据屏幕的 50%。我只能从你的问题中推断这不是你想要的。

您可以删除 layout="row"

md-content.management-panelmd-background.md-hue-1(flex="100")

这将解决动态高度问题。你没有说你要求的布局是什么,所以我建议我自己的。

因为你有下面的flex class。删除它,它将正常工作。

.row.flex(layout="row", layout-align="begin begin", ng-repeat="item in vm.managementPanelsFields", style="margin-bottom: 30px;")

(function() {
  'use strict';
  angular
    .module('SampleApp', ['ngMaterial'])
    .controller('AppCtrl', function() {
      var vm = this;
      vm.managementPanelsFields = [{
        name: 'Foo',
        isVisible: true,
        IsMultipleValue: true,
        value: [],
        id: 10,
        fieldType: 'Int'
      }, {
        fieldType: 'TextArea',
        isVisible: true,
        IsMultipleValue: false,
        id: 20
      }];

      vm.newValue = function(item) {
        item.value.push(100);
      };
      vm.deleteValue = function(item, index) {
        item.value.splice(index, 1);
      }
    });
})();
<html ng-app="SampleApp">

<head>
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">
  <!-- Angular Material requires Angular.js Libraries -->
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>

  <!-- Angular Material Library -->
  <script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>
</head>

<body ng-cloak="ng-cloak" ng-controller="AppCtrl as vm">
  <md-content>
    <md-card class="md-whiteframe-4dp">
      <md-card-content style="margin-bottom: 30px;">
        <div layout="row" ng-repeat="item in vm.managementPanelsFields">
          <div flex="40" ng-if="item.isVisible && item.IsMultipleValue">{{item.name}}</div>
          <div flex ng-if="item.isVisible && item.IsMultipleValue && item.fieldType === 'Int'">
            <md-input-container ng-repeat="itemValue in item.value track by $index" class="md-block">
              <label>{{item.watermarkText}}</label>
              <input type="number" name="{{item.id}}-{{$index}}" ng-pattern="item.regexValidation" ng-required="item.isRequired" ng-model="itemValue" />
              <md-icon ng-click="vm.deleteValue(item, $index)">clear</md-icon>
            </md-input-container>
            <div layout="row" layout-align="center center">
              <md-button ng-click="vm.newValue(item)" class="md-raised md-primary">ADD</md-button>
            </div>
          </div>
          <div flex ng-if="item.isVisible && !item.IsMultipleValue && item.fieldType === 'TextArea'" layout="row" layout-align="center center">
            <textarea name="{{item.id}}" ng-trim="false" ng-required="item.isRequired" ng-pattern="item.regexValidation" placeholder="{{item.watermarkText}}" ng-model="item.value"></textarea>
          </div>
        </div>
      </md-card-content>
    </md-card>
  </md-content>
</body>

</html>