【问题标题】:How to initialize form as scope variable in controller如何在控制器中将表单初始化为范围变量
【发布时间】:2015-02-27 13:36:33
【问题描述】:

我有一个简单的角形

<form name="myForm" ng-controller="myFormController"></form>

并且需要在myFormController 中调用$setPristine()myForm。将此表单初始化为$scope 变量的最佳方法是什么?

我试过$scope.myForm.$setPristine();,但它给了我:

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

提前致谢。


编辑来自docs

名称(可选) 表单的名称。如果指定,表单控制器将在此名称下发布到相关范围。

这意味着您可以在控制器中访问它,但是如何访问呢?

【问题讨论】:

    标签: angularjs angularjs-scope angularjs-controller


    【解决方案1】:

    我只是浪费了一些时间来处理这个问题。就我而言,稍后我使用ng-if 显示了表单。将表单条件更改为 ng-show 解决了 $scope.myform 的未初始化问题。

    【讨论】:

    • 我感觉以前遇到过类似的问题。但是该死的,我又一次陷入其中。
    【解决方案2】:

    在你的控制器中试试这个。

    $timeout(function () {
       // here you should be able to access $scope.myForm
    })
    

    【讨论】:

    • 除了在这种情况下不工作$timeout 从来都不是一个好的解决方案;)
    • 它对我有用。你能为此创建一个 plunker/fiddle 吗?
    • ngController 将在priority:500 处处理,之后ngInitpriority:450,然后form 指令与default priority$timeout 将保证@987654330 的成功编译@.
    • @DonJuwe,这对你有用吗?还是您找到了其他解决方案?
    【解决方案3】:

    form 指令确实将表单的名称发布到范围。但是,如果表单嵌套在 ng-controller 元素内,那么当控制器函数运行时,表单的范围变量不可用。

    作为说明:

    <div ng-controller="OuterCtrl">
      <form name="form1">
        <div ng-controller="InnerCtrl"></div>
      </form>
    </div>
    

    会发生以下情况:

    .controller("OuterCtrl", function($scope){
       // $scope.form1.$setPristine(); // this will fail
    })
    .controller("InnerCtrl", function($scope){
       $scope.form1.$setPristine(); // this will succeed
    });
    

    控制器功能运行时很少需要访问表单。通常,它是为了响应某些操作而完成的,例如提交操作。发生这种情况时,"OuterCtrl" 将具有$scope.form1

    .controller("OuterCtrl", function($scope){
       $scope.submitForm = function(){
          //... do something with form data
          $scope.form1.$setPristine();
       }
    });
    

    在这方面,$timeout 实际上会起作用并且不会导致竞争条件。但是您应该重新检查为什么在控制器功能首次运行时需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2015-01-11
      相关资源
      最近更新 更多