【问题标题】:Angular - clear form input after submitAngular - 提交后清除表单输入
【发布时间】:2016-10-23 12:16:08
【问题描述】:

我有一个像这样的简单表格:

<form name="add-form" data-ng-submit="addToDo()">
    <label for="todo-name">Add a new item:</label>
    <input type="text" data-ng-model="toDoName" id="todo-name" name="todo-name" required>
    <button type="submit">Add</button>
</form>

我的控制器如下:

$scope.addToDo = function() {
    if ($scope.toDoName !== "") {
        $scope.toDos.push(createToDo($scope.toDoName));
    }
}

我想做的是在提交后清除文本输入,所以我只是清除模型值:

$scope.addToDo = function() {
    if ($scope.toDoName !== "") {
        $scope.toDos.push(createToDo($scope.toDoName));
        $scope.toDoName = "";
    }
}

现在除外,因为表单输入是“必需的”,所以表单输入周围有一个红色边框。这是正确的行为,但在这种情况下不是我想要的......所以我想清除输入然后模糊输入元素。这导致我:

$scope.addToDo = function() {
    if ($scope.toDoName !== "") {
        $scope.toDos.push(createToDo($scope.toDoName));
        $scope.toDoName = "";
        $window.document.getElementById('todo-name').blur();
    }
}

现在,我知道像这样从控制器修改 DOM 在 Angular 文档中是不受欢迎的 - 但是有没有更 Angular 的方式来做到这一点?

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    我已经让它按照下面的代码工作了。

    HTML 部分

    <td ng-show="a">
     <input type="text" ng-model="e.FirstName" />
    </td>
    

    控制器部分

    e.FirstName= '';

    【讨论】:

      【解决方案2】:

      当您为表单命名时,它会自动添加到 $scope

      因此,如果您将表单名称更改为“addForm”(因为我认为 add-from 不是 angular 的有效名称,不知道为什么),您将获得对 $scope.addForm 的引用。

      如果您使用 angular 1.1.1 或更高版本,您将在 $scope.addForm 上拥有一个 $setPristine() 方法。它应该递归地负责重置您的表单。或者如果你不想使用 1.1.x 版本,你可以look at the source 并模仿它。

      【讨论】:

      • 谢谢!虽然我仍然需要清除模型,但 $setPristine() 可以很好地处理模糊。 'add-form' 似乎有效,我可以使用 $scope['add-form'] 而不是点符号来访问它。
      • 是的,模型的清除总是必须的,因为 $setPristine 不知道你的模型。谢谢你让我知道这个名字!完全错过了我不应该的:)
      • t = {}; t.foo-bar = "baz"; ReferenceError:分配中的左侧无效
      • 你如何使用 $setPristine?
      • $scope.form-name.$model-property.$setPristine() 用于属性级别或 $scope.form-name.$setPristine() 用于表单级别(影响所有表单控件)跨度>
      【解决方案3】:

      对于那些尚未切换到 1.1.1 的用户,这里有一个指令,当 $scope 属性更改时会变得模糊:

      app.directive('blur', function () {
        return function (scope, element, attrs) {
          scope.$watch(attrs.blur, function () {
              element[0].blur();
          });
        };
      });
      

      控制器现在必须在提交发生时更改属性。但至少我们没有在控制器中进行 DOM 操作,也不必通过 ID 查找元素:

      function MainCtrl($scope) {
          $scope.toDos = [];
          $scope.submitToggle = true;
          $scope.addToDo = function () {
              if ($scope.toDoName !== "") {
                  $scope.toDos.push($scope.toDoName);
                  $scope.toDoName = "";
                  $scope.submitToggle = !$scope.submitToggle;
              }
          };
      }
      

      HTML:

      <input type="text" data-ng-model="toDoName" name="todo-name" required 
        blur="submitToggle">
      

      Plnkr

      【讨论】:

      • 谢谢。在 1.1.1 推出之前知道这一点很方便。
      猜你喜欢
      • 2017-12-13
      • 2011-10-21
      • 2018-03-14
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      相关资源
      最近更新 更多