javascript - 检查编译了多少个字段

标签 javascript angularjs angular-material

我在使用带有 Angular Material 的 angularjs 时遇到问题。 在表单中,我有二十个选择字段。我必须观察所有字段,因为我必须允许用户仅编译二十个字段中的三个。如果用户尝试编译第四个字段,则该字段必须返回空白(没有值选择)。

我给出的 HTML 仅包含 4 个字段,但实际上有 20 个字段(我从 Angular Material 网站获取代码)。

<div ng-controller="SelectAsyncController" layout="column" layout-align="center center" style="padding:40px" ng-cloak>
  <p>Select can call an arbitrary function on show. If this function returns a promise, it will display a loading indicator while it is being resolved:</p>
  <div layout="column" layout-align="center center" style="height: 100px;">
    <md-select placeholder="Assign to user" ng-model="field1" md-on-open="loadUsers()" style="min-width: 200px;">
      <md-option ng-value="user" ng-repeat="user in users">{{user.name}}</md-option>
    </md-select>
    <md-select placeholder="Assign to user" ng-model="field2" md-on-open="loadUsers()" style="min-width: 200px;">
      <md-option ng-value="user" ng-repeat="user in users">{{user.name}}</md-option>
    </md-select>
    <md-select placeholder="Assign to user" ng-model="field3" md-on-open="loadUsers()" style="min-width: 200px;">
      <md-option ng-value="user" ng-repeat="user in users">{{user.name}}</md-option>
    </md-select>
    <md-select placeholder="Assign to user" ng-model="field4" md-on-open="loadUsers()" style="min-width: 200px;">
      <md-option ng-value="user" ng-repeat="user in users">{{user.name}}</md-option>
    </md-select>
    <p class="md-caption">You have assigned the task to: {{ user ? user.name : 'No one yet' }}</p>
  </div>
</div>

js:

  $scope.user = null;
  $scope.users = null;
  $scope.loadUsers = function() {
    // Use timeout to simulate a 650ms request.
    return $timeout(function() {
      $scope.users =  $scope.users  || [
        { id: 1, name: 'Scooby Doo' },
        { id: 2, name: 'Shaggy Rodgers' },
        { id: 3, name: 'Fred Jones' },
        { id: 4, name: 'Daphne Blake' },
        { id: 5, name: 'Velma Dinkley' }
      ];
    }, 650);
  };
});

有办法做类似的事情吗? 谢谢建议。

最佳答案

下面您可以看到我提出的解决方案的实际效果。

简要说明:我使用数组作为字段的模型,因此 <md-select>指令由 ng-repeat 循环生成。具体来说,每个 select 元素的模型是字段项(数组的每个项)的 value 属性。

一个<强> $watch ('fields', ...) 检查数组更改,其监听器对已填充的字段进行计数(使用函数 filledFieldsCount() )并验证计数是否等于允许的最大值...

请注意,$watch 将第三个参数设置为 true,以便观察数组项属性的深度变化: $scope.$watch('fields', listener, true);

angular
  .module('MyApp', ['ngMaterial', 'ngMessages'])
  .controller('AppCtrl', function($scope, $timeout) {

    $scope.fields = [
      { "name": "task1", "value": null, "enabled": true },
      { "name": "task2", "value": null, "enabled": true },
      { "name": "task3", "value": null, "enabled": true },
      { "name": "task4", "value": null, "enabled": true },
      { "name": "task5", "value": null, "enabled": true }
    ];
  
    $scope.maxNrFields = 3;
    $scope.users = null;
 
    $scope.loadUsers = function() {

    // Use timeout to simulate a 250ms request.
    return $timeout(function() {

      $scope.users =  $scope.users  || [
        { id: 1, name: 'Scooby Doo' },
        { id: 2, name: 'Shaggy Rodgers' },
        { id: 3, name: 'Fred Jones' },
        { id: 4, name: 'Daphne Blake' },
        { id: 5, name: 'Velma Dinkley' }
      ];

    }, 250);
  };
  
  $scope.$watch('fields', function(newValue, oldValue) {
    console.log("$watch");
    if ($scope.filledFieldsCount()==$scope.maxNrFields) {
      angular.forEach($scope.fields, function(field){
          if (!field.value) field.enabled = false;
      });
    }
  }, true);
  
  $scope.filledFieldsCount = function() {
      var count = 0;
      angular.forEach($scope.fields, function(field){
          count += field.value ? 1 : 0;
      });
      return count; 
  }
  
});
.alert {
  text-align: center;
  width: 100%;
  color: red;
}
<html lang="en" >
<head>
  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
<!-- Angular Material requires Angular.js Libraries -->
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script>

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

</head>
<body> 
<div ng-controller="AppCtrl as ctrl" class="md-padding" ng-cloak="" ng-app="MyApp">
  <div layout="column" layout-align="center center" style="padding:40px" ng-cloak>
    <div layout="column" layout-align="center center">
      <md-select placeholder="Assign {{field.name}} to user" ng-repeat="field in fields" ng-model="field.value" ng-disabled="!field.enabled" md-on-open="loadUsers()" style="min-width: 200px;">
        <md-option ng-value="user" ng-repeat="user in users">{{user.name}}</md-option>
      </md-select>
    </div>
  </div>
  <div class="alert" ng-show="filledFieldsCount()==3">3 task assigned!</div>
  <hr>
  <pre>filledFieldsCount = {{ filledFieldsCount() | json}}</pre>
  <pre>fields = {{ fields | json}}</pre>
</div>
    
</body>
</html>

关于javascript - 检查编译了多少个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34544736/

相关文章:

javascript - 查看嵌套动态 observableArray 中的数据绑定(bind)

javascript - 对复选框选择进行分组

javascript - 当重新加载包含 mysql 数据的表的页面时,它应该转到表的特定部分

javascript - 使用 onClick 传递多个变量

angularjs - 转换 angular2 下的 <select>

javascript - 获取模板并将其附加到 DOM 后的 UI-Router Hook

html - 如何拉伸(stretch) md-nav-item Angular Material

angular - 居中对齐 md-tab-group 标题标签

javascript - 带转到页面的 Angular ng-table

javascript - 如何在 Angular Material 表中获取 <tr> 之间的间隙