angularjs - 如何从位于表单外部的清除按钮清除表单数据

时间:2016-07-08 23:29:41

标签: angularjs forms reset clear form-data

我有一个带有提交按钮的表单,工作正常。但是,我需要从位于页面右上角窗体外的清除按钮清除表单数据。清除按钮存在于父控制器中,位于右上角的表单上方。从清除按钮发送的表单始终显示为未定义,这是因为清除按钮不是表单的一部分。

如何传递相同的表单实例以清除?如何清除数据?如果这是一个设计问题,我仍然需要一个解决方法。

这是我为模仿而创造的小提琴。任何帮助将不胜感激。

https://jsfiddle.net/SobDan/vj67rtb2/

<div ng-app>

<div class="col-md-10">
  <h2>Todo</h2></div>
<div class="col-md-2">
  <button class="btn pull-right" ng-click="clear(TodoForm)"> Close</button>

</div>
<br>
<div ng-controller="TodoCtrl">

  <form name="TodoForm" ng-submit="addTodo()" name="testForm">
    <input type="text" ng-model="todoText" size="30" placeholder="add new todo here">
    <input class="btn-primary" type="submit" value="add">

  </form>

</div>

function MainCtrl($scope) { 

$scope.clear = function(form) {
    alert(form); // the form is undefined
    if (form.$dirty)
      form.setPristine(); // clean this form
    else
      alert("form not dirty");
  };
};

function TodoCtrl($scope) {

  $scope.todoText = "test";
  $scope.addTodo = function() {
    alert("Submitted");
    $scope.todoText = "";
    // submit logic works fine
  };
}

1 个答案:

答案 0 :(得分:1)

您应该使用myfilter = 'tcp and tcp.flags.syn==1 and tcp.flags.ack==0' pkts = sniff(offline="amostra.pcap", filter=myfilter) 在控制器之间进行通信,而不是尝试访问超出范围的表单。

以下是fiddle及以下说明

$broadcast函数用于向所有子$broadcast广播事件。任何感兴趣的孩子$scope都可以注册使用$scope函数来监听事件。此功能用于在控制器之间进行通信。

在您的情况下,我们通过从$on广播名为clearForm的事件来发信号以清除表单。监听事件clearForm的TodoCtrl $rootScope将收到清除表单字段的信号。

$scope

AngularJS 1.1.x +

app.controller("MainCtrl", function($scope, $rootScope) { $scope.clear = function(form) { $rootScope.$broadcast("clearForm"); }; }); app.controller("TodoCtrl", function($scope) { $scope.$on("clearForm", function() { if ($scope.testForm.$dirty) { $scope.testForm.$setPristine(); $scope.todoText = ""; } else { alert("form not dirty"); } }); }); 仅适用于AngularJS 1.1.x版。

$scope.form.$setPristine()只会将表单状态设置为pristine,并且不会清除表单字段。您需要通过取消将在屏幕上反映的$ scope变量来手动清除它。

$setPristine()

AngularJS 1.0.x +

if ($scope.testForm.$dirty) { $scope.testForm.$setPristine(); $scope.todoText = ""; } 函数在1.0.x版本中不可用。

您问题中的示例Fiddle似乎已配置为1.0.x

在1.0.x中,您只需清除$ scope变量

$setPristine
相关问题