1

我想将POSThtml 表单中的数据传输到默认操作 url,但一个隐藏的输入取决于从服务调用返回的数据。当我ng-submit在完成$scope之前使用服务调用后不会更新POST。我不能使用 Ajax POST,因为在POST.

表格如下所示:

<form name="payment" role="form" class="form-inline" ng-show="!loading" method="POST" action="{{paymentUrl}}" ng-submit="createOrder()" novalidate>
   <input type="hidden" id="responseUrl" name="responseUrl" value="{{postPaymentUrl}}"/>
   <input type="hidden" id="orderNumber" name="orderNumber" value="{{orderNumber}}"/>
   <select class="form-control" id="paymentMethodBrand" name="paymentMethodBrand">
      <option ng-repeat="paymentMethod in paymentMethods | orderBy:'method'" value="{{paymentMethod.method}}">{{paymentMethod.method}}</option>
   </select>
   <button type="submit" class="btn btn-default" translate="BUY"></button>
</form>

action字段中的 url 被正确填写。

控制器中的createOrder功能是这样的:

$scope.createOrder = function () {
  Payment.start($scope.selectedProduct)
    .then(function (response) {
          $scope.orderNumber = response.data.orderNumber;
  });
};

问题是隐藏的输入 orderNumber 在打开实际操作 URL 之前没有被填充。因此,发布的数据不正确。

关于如何解决这个问题的任何想法?我正在使用 angularjs 1.2.16。

4

1 回答 1

3

问题在于异步Payment.start设置$scope.orderNumber承诺的解决方案,但表单提交会立即发生。通常你会通过省略表单上的action属性来阻止基于 Angular 的表单中的默认操作,因为 Angular 是为基于客户端的应用程序设计的。但是在您的情况下,您希望正常的 http 帖子发生,这很不寻常。这让我们踏上了“最佳实践”领域之外的旅程。

所以,承认这是一个不寻常的用例,我将提供一个有点骇人听闻的解决方案。您可以从表单中省略 action 属性,然后在从 解决promise 时添加它,然后Payment.start才触发表单提交:

$scope.createOrder = function () {
  Payment.start($scope.selectedProduct)
    .then(function (response) {
          $scope.orderNumber = response.data.orderNumber;
          var form = $('#form-id');
          form.attr('action', $scope.paymentUrl);
          form.submit();
  });
};

这是未经测试的,但我认为它应该适合你。

于 2014-06-16T14:45:24.050 回答