【问题标题】:form reset error in angular 1.5 with controller As syntax使用控制器作为语法在角度 1.5 中形成重置错误
【发布时间】:2016-06-30 06:10:13
【问题描述】:

使用 angular 1.5 这是非常基本的问题

当我点击表单的重置按钮时;它在控制台中给出错误

无法读取未定义的属性“$setPristine”

下面是我的相关代码

form.html

 <form name="loginForm" ng-controller="LoginController as vm" ng-submit="vm.login(credentials)" novalidate >  
  ...form details ...
 <button type="reset" class="btn btn-warn" ng-click="vm.reset()">Reset</button>

login.controller.js

login
  .controller('LoginController', function($scope){
    var self = this;

   self.reset = function () {
      self.loginForm.$setPristine();
      self.loginForm.$setUntouched();
    };

即使我尝试使用form="form.loginForm",但没有成功

请提出问题所在。这里是my full code plunker

【问题讨论】:

    标签: angularjs forms


    【解决方案1】:

    如果你想在你的控制器中访问你的form 并且你使用controller as 语法,只需将你的表单名称更改为这种格式:name="alias.formName"

    由于您在将控制器声明为ng-controller="LoginController as vm" 时使用的是vm,因此您的表单应为:

    &lt;form name="vm.loginForm" ng-controller="LoginController as vm" ng-submit="vm.login(credentials)" novalidate &gt;

    也不要忘记更改您的 ngMessages 块。

    <div ng-messages="vm.loginForm.username.$error" ng-if="vm.loginForm.username.$touched">
       <p ng-message="required">Your name is required.</p>
       <p ng-message="minlength">Your name is too short.</p>
    </div>
    

    更新:

    使用$setPristine 只会生成$pristine 表单,它不会重置表单字段的值。如果您的目标也是重置表单字段值,那么您必须在重置函数中设置self.credentails = {username: '',password: ''}

    【讨论】:

    • 那也无济于事
    • @pro.mean 当我编辑你的 plunk 时它正在工作。错误是否仍然出现?或者当您说“这也无济于事”时,是因为表单字段中的值没有重置吗?
    • 以及如何做到这一点?我在 reset() 中写了self.credentails = angular.copy(self.loginForm.credentials);,但它没有清除
    • 谢谢。我反复记不住同一个表格。
    • 设置self.credentails = {username: '',password: ''}self.loginForm 不包含 credentials 对象。
    【解决方案2】:

    有几个问题:

    1. 您没有使用相同版本的 angular 和 angular-messages
    2. 您的 plunkr 不使用ng-controller="LoginController as vm",而是使用ng-controller="LoginController"
    3. 您希望表单在控制器中,但它在 $scope 中,因为您使用 name="loginForm" 而不是 name="vm.loginForm"

    【讨论】:

    • 那是错字。我会解决的
    • 是否需要使用相同版本的ng-message?没有比 1.4.9 最新的版本,plunket 也未能添加
    • 是的,这是必要的。所有官方 Angular 模块同时发布,版本相同,并且经过测试可以协同工作。您不能确定 ngMessages 1.4.2 能否与 angular 1.5.6 和 ngRoute 1.0.3 一起正常工作。是的,有一个更新的版本:ajax.googleapis.com/ajax/libs/angularjs/1.5.6/…
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2016-12-31
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多