在AngularJS中加载控制器之前,如何强制视图加载模型值?

在AngularJS中加载控制器之前,如何强制视图加载模型值?,angularjs,angularjs-controller,Angularjs,Angularjs Controller,我正在尝试从控制器自动发布表单,而不在表单上进行任何用户交互。我在控制器中有一个private init()函数,用于触发窗体上的按钮单击。 但是隐藏的表单字段还没有得到值。如何确保在表单提交之前填充隐藏字段的值 谢谢你的建议 <div> <form name="myForm" method="post" action="@Model.Settings["URL"]" ng-controller="MyCtrl"> <input type="hi

我正在尝试从控制器自动发布表单,而不在表单上进行任何用户交互。我在控制器中有一个private init()函数,用于触发窗体上的按钮单击。 但是隐藏的表单字段还没有得到值。如何确保在表单提交之前填充隐藏字段的值

谢谢你的建议

<div>
 <form name="myForm" method="post" action="@Model.Settings["URL"]" ng-controller="MyCtrl">

        <input type="hidden" name="userid" value="{{UserSettings.Settings.UserId}}">
        <input type="hidden" name="amount" value="{{Payment.Amount}}">


        <button id="payButton" type="submit" class="action blue"><span class="label">Pay</span></button>

        <script language="javascript">
            var UserSettings = (function (o) {
                return o;
            })(@Html.Raw(JsonConvert.SerializeObject(@Model)));
        </script>
    </form>
</div>

 myControllers.controller('MyCtrl', ['$scope', '$state', '$element', 'dataService', 
  function ($scope, $state, $element, service) {

      $scope.Payment = service.GetPayment());
      $scope.UserSettings = UserSettings;

      function init() {

        // How can I force to have values in the hidden form fields before the button click that submits the form ?

          $element.find('#payButton').trigger("click");
      };

      init();
  }]);

您可以将填充放在定义状态的点上,该状态具有
MyCtrl
,如下所示:

.state('myState', {
    // ...
    resolve: {
         Payment: ['dataService', function (dataService) {
             return dataService.GetPayment();
         }],
         // Same for other objects needed
    }
})
然后在控制器中:

myControllers.controller('MyCtrl', ['$scope', '$state', '$element', 'Payment',
  function ($scope, $state, $element, Payment) {

      $scope.Payment = Payment;
      // Same for other objects needed

      // Rest code         
}
在resolve部分中的所有操作和承诺完成之前,控制器中的代码不会开始运行

更新:

您可以将
init
调用放入
$timeout

$timeout(function(){
    init();
});

当然,您必须在控制器函数中注入
$timeout
以及其他依赖项。

您可以将填充放在定义状态的点上,该状态具有
MyCtrl
,如下所示:

.state('myState', {
    // ...
    resolve: {
         Payment: ['dataService', function (dataService) {
             return dataService.GetPayment();
         }],
         // Same for other objects needed
    }
})
然后在控制器中:

myControllers.controller('MyCtrl', ['$scope', '$state', '$element', 'Payment',
  function ($scope, $state, $element, Payment) {

      $scope.Payment = Payment;
      // Same for other objects needed

      // Rest code         
}
在resolve部分中的所有操作和承诺完成之前,控制器中的代码不会开始运行

更新:

您可以将
init
调用放入
$timeout

$timeout(function(){
    init();
});

当然,您必须在控制器函数中注入
$timeout
以及其他依赖项。

也许您应该在状态的解析阶段填充
$scope.Payment
$scope.UserSettings
。您使用的是Angular1还是2+?我使用的是AngularJS(1.4.3版本)。您使用的是用于状态的ui路由器吗?您可以发布该州的代码吗?在继续单击之前,您是否尝试使用$q服务加载数据?是的,我使用的是ui路由器。我将用代码更新我的帖子。也许你应该在州的解析阶段填充
$scope.Payment
$scope.UserSettings
。您使用的是Angular1还是2+?我使用的是AngularJS(1.4.3版本)。您使用的是用于状态的ui路由器吗?您可以发布该州的代码吗?在继续单击之前,您是否尝试使用$q服务加载数据?是的,我使用的是ui路由器。我将用代码更新我的帖子。实际上,控制器在运行init()之前已经获得了所需的所有数据。但问题是init()会触发一个按钮单击,以在视图中发布表单。但是视图的模型绑定还没有。使用
$timeout
建议更新了我的答案。实际上,控制器在运行init()之前已经获得了所需的所有数据。但问题是init()会触发一个按钮单击,以在视图中发布表单。但是视图的模型绑定还没有。用
$timeout
建议更新了我的答案。